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服务器:执行动态SQL的帮助,请

最后一部分既是SQL Server 2005和2008上的存储过程返回号码VARCHAR(MAX)用逗号分隔。

现在这个返回值大到600k个字符以上。如果我在SQL Server 2005上执行此操作,它的工作时间为50%,总是填充@HostIDs,并使用正确的值生成@UpdateSQL并执行。

在SQL Server 2008中,@HostIDs填充但@UpdateSQL始终是NULL

这weirding我出极大

谁能也许阐明我奇怪的问题一些轻?

+0

也许其中一个变量是'NULL'。你测试了所有这些吗? –

+4

为什么你需要首先创建'@ UpdateSQL'? (它看起来像是SQL注入的目标。)为什么你不只是将命令作为实际的语句? – freefaller

回答

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并在直接执行操作时显示特定代码段时执行它。

+0

非常酷,我不知道这个功能!它比执行ISNULL更好吗?它不适用于这个问题,因为它可能需要在null情况下插入null值,并且不会产生空字符串,但我肯定可以在过去一次或两次使用此功能。 – d89761

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') + ' 
     '; 
+0

谢谢......我不知道一个是否为空整个事情将是空的 –

0

它会导致因为你不处理空值

你可以使用EXEC的sp_executesql的,而不是它拥有EXEC一些好处