我正在使用动态SQL来构建一些语句。以下是存储过程UpdateFOO
的截断示例。当我调试这个存储过程时,问题是我声明的@SQL
变量总是保持空白!它应该填充查询。我怀疑它与我如何格式化这一点有关,但我不能发现它是否格式错误。
CREATE PROC [dbo].[UpdateFOO]
@TEST1 uniqueidentifier,
@TEST2 nvarchar(40),
@TEST3 nvarchar(50),
@TEST4 char(1),
@TEST5 nvarchar(20),
@TEST6 nvarchar(40),
@LINKED_SERVER_NAME nvarchar(max),
@DATABASE_NAME nvarchar(max)
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
DECLARE @SQL nvarchar(max)
SELECT @SQL = 'UPDATE [' + @LINKED_SERVER_NAME + '].[' + @DATABASE_NAME + '].[dbo].[SOME_TABLE]
SET [TEST1]=' + '''' + convert(nvarchar(36), @TEST1) + '''' +',
[TEST2]=' + '''' +@TEST2 + '''' +',
[TEST3]=' + '''' + @TEST3 + '''' +',
[TEST4]='+ '''' + @TEST4 + '''' +',
[TEST5]=' + '''' + @TEST5 + '''' +',
[TEST6]=' + '''' + @TEST6 + '''' +
' WHERE [TEST1] =' + '''' + convert(nvarchar(36), TEST1 )+ '''' +
+ 'SELECT [TEST1] FROM
[' + @LINKED_SERVER_NAME + '].[' + @DATABASE_NAME + '].[Rev].[SOME_TABLE]
WHERE [TEST1] =' + '''' + convert(nvarchar(36), TEST1 )+ '''' +''
PRINT LEN(@SQL)
EXEC (@SQL)
COMMIT
TIA专家!
答案 0 :(得分:1)
以下是您使用ISNULL的方法。如果第一个值为null,则返回第二个值。
SELECT @SQL = 'UPDATE [' + @LINKED_SERVER_NAME + '].[' + @DATABASE_NAME + '].[dbo].[SOME_TABLE]
SET [TEST1]=' + '''' + convert(nvarchar(36), ISNULL(@TEST1, '')) + '''' +',
[TEST2]=' + '''' +ISNULL(@TEST2, '') + '''' +',
[TEST3]=' + '''' + ISNULL(@TEST3, '') + '''' +',
...
等...
答案 1 :(得分:0)
您应该使用参数化查询。这是一个例子:
DECLARE @sql nvarchar(max), @paramlist nvarchar(max)
SELECT @sql= 'UPDATE Table
SET Col1 = @Value1,
Col2 = @Value2
WHERE (1 = 1)'
SELECT @paramlist = '@Value1 nvarchar (256), @Value2 nvarchar (256)'
EXEC sp_executesql @sql, @paramlist, @Value1, @Value2