Обновите поле с помощью хранимой процедуры, где значение для поля содержит несколько '' - PullRequest
0 голосов
/ 01 марта 2020

У меня есть хранимая процедура, в которой я пытаюсь обновить столбец с содержимым @Value.

Это моя хранимая процедура:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [PowerApp].[UpdateTableRequestSingle]
    (@Solution nvarchar(100),
     @ColumnName nvarchar(100),
     @Value nvarchar(255),
     @Record nvarchar(100),
     @CreatedBy nvarchar(50),
     @ExecutionFlag nvarchar(1)) 
AS
BEGIN
    DECLARE @CRLF VARCHAR(2) = CHAR(13) + CHAR(10) --Linebreak
    DECLARE @SQLStatement VARCHAR(MAX)

    SET @SQLStatement = 'UPDATE [Extract' + @Solution + '].[TableRequest]' + @CRLF + 
                        'SET [' + @ColumnName + '] = ' + '''' + @Value + '''' + @CRLF +
                        'WHERE TableName = ' + '''' + @Record + ''''

    DECLARE @SQLStatementHistoryLog VARCHAR(MAX)
    SET @SQLStatementHistoryLog = 'INSERT INTO [Extract' +  @Solution + '].[TableRequestHistoryLog] ([SQLStatement], [CreatedBy])' + @CRLF +
'VALUES(''' + REPLACE(@SQLStatement,'''','''''') + ''',''' + @CreatedBy + ''')'

    IF @ExecutionFlag = '0'
    BEGIN
        PRINT @SQLStatement
        PRINT @SQLStatementHistoryLog
    END

    IF @ExecutionFlag = '1'
    BEGIN
        BEGIN TRANSACTION;
            EXEC (@SQLStatement)
            EXEC (@SQLStatementHistoryLog)
        COMMIT TRANSACTION;
    END
END;

И я ее выполняю с этим:

/*
[PowerApp].[UpdateTableRequestSingle] 
           @Solution = 'SF', 
           @ColumnName = 'TableDataRequestWhereCustomDescription', 
           @Value = 'CRM_CP_Owner_Company_Number__c IN ('190', '230', '440', '450', '480')',
           @Record = 'Account',
           @CreatedBy = 'DKRAH',
           @ExecutionFlag = 1
*/

Если я передам

@Value = 'CRM_CP_Owner_Company_Number__c IN (190, 230, 440, 450, 480)'

, он работает, но я хочу, чтобы он работал с

@Value='CRM_CP_Owner_Company_Number__c IN ( '190', '230', '440', '450', '480')'

Кто-нибудь знает, как редактировать T - SQL чтобы все заработало.

1 Ответ

1 голос
/ 01 марта 2020

Вы не можете исключить одинарные кавычки в @Value и, следовательно, получите неэкранированные одинарные кавычки в вашем динамическом c запросе.

Вы должны использовать параметризацию, используя sp_executesql. Вы также должны использовать quotename(), чтобы получить правильно цитируемые идентификаторы.

...

SET @SQLStatement = 
'UPDATE ' + quotename('Extract' + @Solution) + '.[TableRequest]' + @CRLF + 
'SET ' + quotename(@ColumnName) + ' = @Value' + @CRLF +
'WHERE TableName = @Record';

...

EXECUTE sp_executesql @SQLStatement, '@Value nvarchar(255), @Record nvarchar(255)', @Value = @Value, @Record = @Record;

...

(и аналог для @SQLStatementHistoryLog)

для @ColumnName и, возможно, даже @Solution, вам лучше используйте тип sysname, который является типом для идентификаторов.

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