0
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

这让我非常奇怪

任何人都可以阐明我的奇怪问题吗?

4

3 回答 3

1

如果任何参数为空,则整个语句将为空。您可以通过执行以下操作来解决它(我不知道数据类型是什么,但有时您需要将它们从 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') + '
        ';
于 2012-09-25T16:19:29.973 回答
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- 这些是所有变量都不为 null 的情况。

不过完全同意 freefaller 的观点,除非问题是对更大谜题的抽象,否则没有理由构建动态 SQL 并在直接执行适用于所示特定代码段时执行它。

于 2012-09-25T23:46:44.863 回答
0

这是因为您没有处理空值

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

于 2012-09-25T23:05:04.413 回答