0

次のスクリプト(SQL Server 2008PRINT(@sql) )を実行しようとしていますが、下部で最後のスクリプトを実行すると、スクリプトの最初の部分が常に欠落しているようです。スクリプトの最初の部分をどういうわけか上書きしていますか?

@sql問題は、内で変数を宣言することだと思いますCURSOR。宣言を上に移動する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
4

1 に答える 1

0

変数の 1 つが 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 の場合、null 値を文字列と連結すると NULL の結果が得られます。たとえば、SELECT 'abc' + NULL は NULL を生成します。SET CONCAT_NULL_YIELDS_NULL が OFF の場合、null 値と文字列を連結すると、文字列自体が生成されます (null 値は空の文字列として扱われます)。たとえば、SELECT 'abc' + NULL は abc を生成します。

于 2013-01-24T00:59:49.703 に答える