SQL Server:请执行动态sql帮助

时间:2012-09-25 14:25:17

标签: sql-server sql-server-2008 sql-server-2005 stored-procedures

EXEC SP_EXECUTESQL 
            @DynamicSQL
        ,   N'@HostIDs VARCHAR(MAX) OUTPUT'
        ,   @HostIDs OUTPUT;

PRINT @HostIDs;

SELECT @HostIDs AS HostIDs;
SET @UpdateSQL = '
            EXECUTE [dbo].[usp_Win7_HostUpdater_NEW]
            @HostID = ''' + @HostIDs + ''' , 
            @PackageID = ''' + @PackageID  + ''' , 
            @MigrationFlag = ''' + @MigrationFlagID + ''' , 
            @Manufacturer = ' + @Manufacturer + ' , 
            @Product = ' + @Product + ' , 
            @Version = ' + @Version + ' ,
            @Reason = ' + @Reason + ' ,
            @Contact = ' + @Contact + '
        ';

        SELECT @UpdateSQL AS UpdateSQL;
        PRINT @UpdateSQL;           
        EXEC( @UpdateSQL )  
  END  

我在SQL Server 2005和2008上都有一个存储过程,其中上面的代码是

的最后一部分

它返回以逗号分隔的VARCHAR(MAX)个数字。

现在这个返回值超过600k个字符。如果我在SQL Server 2005上执行此操作,它会在50%的时间内工作,@HostIDs将始终填充,@UpdateSQL将使用正确的值生成并执行。

在SQL Server 2008上,填充了@HostIDs,但@UpdateSQL始终为NULL

这极大地困扰着我

任何人都可以对我的奇怪问题有所了解吗?

3 个答案:

答案 0 :(得分:1)

如果任何参数为null,则整个语句将为null。您可以通过执行此类操作来解决此问题(我不知道数据类型是什么,但有时您需要将它们从int / bool / etc。类型转换为varchar以使串联工作):

SET @UpdateSQL = '
            EXECUTE [dbo].[usp_Win7_HostUpdater_NEW]
            @HostID = ' + ISNULL('''' + @HostIDs + '''', 'null') + ' , 
            @PackageID = ' + ISNULL('''' + @PackageID + '''', 'null')  + ' , 
            @MigrationFlag = ' + ISNULL('''' + @MigrationFlagID + '''', 'null') + ' , 
            @Manufacturer = ' + ISNULL(@Manufacturer, 'null') + ' , 
            @Product = ' + ISNULL(@Product, 'null') + ' , 
            @Version = ' + ISNULL(@Version, 'null') + ' ,
            @Reason = ' + ISNULL(@Reason, 'null') + ' ,
            @Contact = ' + ISNULL(@Contact, 'null') + '
        ';

答案 1 :(得分:1)

检查这些

SET CONCAT_NULL_YIELDS_NULL OFF
select 'abc' + null + 'def'
--- abcdef

SET CONCAT_NULL_YIELDS_NULL ON
select 'abc' + null + 'def'
--- NULL

解决这个问题的唯一方法就是在你的字符串构建之前将其设置为关闭状态。字符串连接序列中的任何NULL都会将整个语句呈现为NULL,这解释了it works like 50% of the time - 这些是所有变量都为非空的时候。

完全同意freefaller,除非问题是一个更大的谜题的抽象,当直接执行对所示的特定片段起作用时,没有理由构建动态SQL和EXEC。

答案 2 :(得分:0)

它导致因为您没有处理空值

你可以使用sp_executesql而不是exec它比exec有一些好处