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一些好處