Reputation: 95
I have a stored procedure where I am trying to update a column with the content of @Value
.
This is my stored procedure:
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;
And I am executing it with this:
/*
[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
*/
If I pass
@Value = 'CRM_CP_Owner_Company_Number__c IN (190, 230, 440, 450, 480)'
it works but I want it to work with
@Value='CRM_CP_Owner_Company_Number__c IN ( '190', '230', '440', '450', '480')'
Does anyone know how to edit the T-SQL to make it work.
Upvotes: 0
Views: 35
Reputation: 37472
You don't escape the single quotes in @Value
and therefore end up with unescaped single quotes in you dynamic query.
You should use parameterization using sp_executesql
. You should also use quotename()
to get the correctly quoted identifiers.
...
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;
...
(And analog for @SQLStatementHistoryLog
)
for @ColumnName
and maybe even @Solution
you should better use the type sysname
which is the type for identifiers.
Upvotes: 1