Передача специального символа [char (11), char (7)] в хранимой процедуре в виде строки - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу найти в таблице все записи со специальными символами - char (11), char (7) и т. Д.

Я нашел одну хранимую процедуру, которая помогает мне ее найти.Но он не принимает входные параметры следующим образом:

EXEC sp_FindStringInTable '%'+char(7)+'%', 'CPOA-TALENTLink-Test-Leeds', 'TALENT_Contact_ChangeLog'

Ошибка :

Сообщение 102, уровень 15, состояние 1, строка 1
Неверный синтаксис рядом с '+'.

Хранимая процедура:

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 

Как уже упоминалось, я не могу найти в таблице специальные символы.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

В вызовах процедур выражения, отличные от литералов или переменных, не работают.

Назначьте конкатенацию переменной и передайте эту переменную процедуре.

DECLARE @p varchar(max) = '%' + char(7) + '%';

EXEC sp_FindStringInTable @p, 'CPOA-TALENTLink-Test-Leeds', 'TALENT_Contact_ChangeLog';
0 голосов
/ 21 декабря 2018

Объединение буквенных строк, таких как '[' + @schema + ']' и ' LIKE ''' + @stringToFind + '''', небезопасно. Вдали от этого .Я подозреваю, что параметризация вашего запроса исправит это:

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 

Обратите внимание, что я не проверял выше.Ваш лучший друг поможет вам в отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...