2013-01-24 42 views
0

我试图执行下面的脚本(SQL Server 2008),但似乎脚本的第一部分始终缺失,当我在底部执行最后的PRINT(@sql)时。我是否以某种方式覆盖脚本的第一部分?如何使用动态SQL在游标内附加SQL语句?

我认为问题是在CURSOR内声明@sql变量。当我移动OPEN @tableCursor以上的声明时,我收到不同的输出。在表格光标中设置@sql变量的含义是什么?

OPEN @tableCursor 
FETCH NEXT FROM @tableCursor INTO @constituentId, @internalName, @fieldName, @value 
WHILE (@@fetch_status = 0) 
BEGIN 

SET @sql = '' 
IF (@fieldName = 'MARKET_SECTOR_DES') 
BEGIN 
-- this is the section that is missing when I do the PRINT(@sql) below 
SELECT @sql = @sql + ' 
    -- Update BloombergMarketSector 
    UPDATE dbo.Constituent 
    SET BloombergMarketSector = ''' + @value + ''', 
     ModifiedDate = GETDATE() 
    WHERE id = ' + @constituentId + ' 
    ' 
PRINT (@sql) -- this works 
END 

PRINT (@sql) -- this works - it seems the issue is happening with this SELECT statement 
SELECT @sql = @sql + '    
    -- Update the Column     
    -- The Column Exists - update 
    IF NOT EXISTS (
       SELECT TOP 1 * 
       FROM dbo.ConstituentBloombergAttribute AS cba 
       WHERE cba.ConstituentId = ' + @constituentId + ') 
    BEGIN 
     INSERT 
     INTO dbo.ConstituentBloombergAttribute (ConstituentId, ModifiedBy, ModifiedDate, CreatedBy, CreatedDate) 
     VALUES (' + @constituentId + ', ''admin'', GETDATE(), ''admin'', GETDATE())      
    END 

    UPDATE dbo.ConstituentBloombergAttribute 
    SET ' + @internalName + ' = ''' + @value + ''', 
     ModifiedDate = GETDATE() 
    WHERE ConstituentId = ' + @constituentId + ' 
    ' 

PRINT @sql 
FETCH NEXT FROM @tableCursor INTO @constituentId, @internalName, @fieldName, @value 
END 
+1

您是否尝试过使用'SET'? –

+0

@AbeMiessler我真的做了,我注意到了同样的事情。尽管如此,我会再试一次。 –

+2

你确定'@fieldName ='MARKET_SECTOR_DES''? – Hogan

回答

0

你的一个变量为null,试试这个:

SELECT @sql = @sql + ' 
    -- Update BloombergMarketSector 
    UPDATE dbo.Constituent 
    SET BloombergMarketSector = ''' + isnull(@value,'V MISSING') + ''', 
     ModifiedDate = GETDATE() 
    WHERE id = ' + isnull(@constituentId,'C MISSING') + ' 
    ' 

可能是一个数据库设置:当SET CONCAT_NULL_YIELDS_NULL为ON,串联一个字符串空值生成空的结果。例如,SELECT'abc'+ NULL会产生NULL。当SET CONCAT_NULL_YIELDS_NULL为OFF时,将空值与字符串连接会生成字符串本身(空值被视为空字符串)。例如,SELECT'abc'+ NULL产生abc。

+0

这个想法唯一的问题是,如果任何变量都是'null',那么它就会使所有东西都变为null。所以'@ sql'的最终结果应该是'null',而不是完整语句的一半。 – mellamokb

+0

@mellamokb你是对的,问题中的代码是不准确或不完整的。 – JBrooks

+0

变量不是'null',但这是一个很好的建议。如果我在'END'之前或之后放入'PRINT(@sql)',它会打印出正确的语句。我认为问题出在那个'SELECT'语句上,但我不确定哪里出了问题。 –