动态SQL,空变量,格式问题?

时间:2014-03-20 19:46:41

标签: sql sql-server

我正在使用动态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专家!

2 个答案:

答案 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