首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将存储过程中的特殊字符[char(11),char(7)]作为字符串传递

将存储过程中的特殊字符[char(11),char(7)]作为字符串传递
EN

Stack Overflow用户
提问于 2018-12-21 09:47:42
回答 2查看 2.8K关注 0票数 0

我想在表中搜索所有具有特殊字符的记录- char(11)、char(7)等。

我找到了一个存储过程,它帮助我找到它。但它不接受输入参数如下:

代码语言:javascript
复制
EXEC sp_FindStringInTable '%'+char(7)+'%', 'CPOA-TALENTLink-Test-Leeds', 'TALENT_Contact_ChangeLog'

误差

Msg 102,15级,状态1,第1行 “+”附近的语法不正确。

存储过程:

代码语言:javascript
复制
CREATE PROCEDURE dbo.sp_FindStringInTable 
     @stringToFind NVARCHAR(100), 
     @schema SYSNAME, 
     @table SYSNAME
AS
BEGIN TRY
    DECLARE @sqlCommand VARCHAR(MAX) = 'SELECT * FROM [' + @schema + '].[' + @table + '] WHERE ' 

    SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' + @stringToFind + ''' OR '
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = @schema
      AND TABLE_NAME = @table 
      AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar')

    SET @sqlCommand = LEFT(@sqlCommand, LEN(@sqlCommand) - 3)

    EXEC (@sqlCommand)
   PRINT @sqlCommand
END TRY
BEGIN CATCH 
   PRINT 'There was an error. Check to make sure object exists.'
   PRINT error_message()
END CATCH 

正如错误中提到的,我无法在表中搜索特殊字符。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-21 10:32:26

在对过程的调用中,除了文字或变量之外,表达式不起作用。

将连接分配给变量,并将该变量传递给过程。

代码语言:javascript
复制
DECLARE @p varchar(max) = '%' + char(7) + '%';

EXEC sp_FindStringInTable @p, 'CPOA-TALENTLink-Test-Leeds', 'TALENT_Contact_ChangeLog';
票数 2
EN

Stack Overflow用户

发布于 2018-12-21 09:55:09

'[' + @schema + ']'' LIKE ''' + @stringToFind + ''''这样的字符串连接是不安全的。,远离它,。我怀疑参数化查询会解决这个问题:

代码语言:javascript
复制
CREATE PROCEDURE dbo.sp_FindStringInTable @stringToFind NVARCHAR(100), @schema sysname, @table sysname 
AS

    BEGIN TRY
        DECLARE @sqlCommand varchar(max);
        SET @sqlCommand = N'SELECT *' + NCHAR(10) + --Formatting yoru dynamic SQL is a very good idea
                          N'FROM ' + QUOTENAME(@schema) + N'.' + QUOTENAME(@table) + NCHAR(10) +
                          N'WHERE' +
                          STUFF((SELECT NCHAR(10) + N'  AND ' + QUOTENAME(COLUMN_NAME) + N'LIKE @String'
                                 FROM INFORMATION_SCHEMA.COLUMNS 
                                 WHERE TABLE_SCHEMA = @schema
                                   AND TABLE_NAME = @table 
                                   AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar')
                                 FOR XML PATH(N'')),1,6,N'')
        PRINT @sqlCommand; --your best friend
        EXEC sp_executesql @sqlCommand, N'String nvarchar(100)', @String = @stringToFind;

        END TRY

    BEGIN CATCH 
       PRINT 'There was an error. Check to make sure object exists.'
       PRINT error_message()
    END CATCH 

注意,我还没有对上面的内容进行测试。你最好的朋友在那里帮你调试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53882487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档