2009-09-15 47 views
0

我有這個龐大的存儲過程,我正在構建一個sql語句。最後,我創建了一個參數列表,如下所示:這是在存儲過程中使用sp_executesql的正確方法嗎?

DOES @paramList需要和N在它前面嗎?

SELECT @paramList = '@param1 nvarchar(300), 
       @param2 nvarchar(10), 
      @param3 nvarchar(10), 
      @param4 nvarchar(100), 
      @param5 nvarchar(1000), 
      @param6 nvarchar(1000), 
      @param7 nvarchar(200), 
      @param8 nvarchar(2000)’ 

我然後調用sp_executesql的是這樣的:

EXEC sp_executesql @sql, @paramList, 
    @param1,@param2,@param3,@param4, 
      @param5,@param6,@param7,@param8 

其中@sql是語句,paramList是我的參數列表和所有其它變量同我在存儲的頂部聲明的參數程序。這是做到這一點的正確方法嗎?

+1

它運行嗎?如果是這樣,你明白了!如果不在這裏給出錯誤信息。 – 2009-09-15 20:30:56

+0

看起來你在paramList的末尾有一個捲曲的引號,但這可能只是你使用的任何工具的人工產物。 – 2009-09-15 20:38:02

+0

它運行。是的,這應該是一個單一的qoute,但它看起來很奇怪。我用word來格式化。我之所以問這是否正確的原因是因爲當我運行跟蹤時,我沒有看到它說sp_executesql,它只是說EXEC – Xaisoft 2009-09-15 20:39:53

回答

1

如果該字符串不使用數據庫排序規則之外的字符,則不需要N「符號。

您沒有聲明@paramList的聲明。只有在聲明瞭NVARCHAR的情況下,N'纔有用。

SQL Server會自動處理VARCHAR和NVARCHAR值之間的轉換(再次涉及數據庫歸類)。

因此,就你而言,解決方案的工作原理。 「正確的」方法是使用NVARCHAR和N「,但在這種情況下不是必需的。

1

是的,這是正確的方法。您可以直接將'@param1 nvarchar(300), ..., @param8 nvarchar(2000)'傳遞給sp_executesql,不需要通過@paramList傳遞它。另外,sp_executesql的第二個參數是一個unicode類型,所以你可能會做一些額外的ASCII到Unicode的對話。你可以做直:

EXEC sp_executesql @sql, 
    N'@param1 nvarchar(300),...,@param8 nvarchar(2000)', 
    @param1,...,@param8; 

是更好地保持在呼叫本身的參數列表中聲明,因爲是如此緊密地與傳遞的實際參數耦合。

+0

我將它作爲@paramList傳遞,因爲這是Microsoft設置示例的方式。 – Xaisoft 2009-09-15 20:48:09

+0

夠公平的。但是在MSDN的例子中'@ ParmDefinition'是'N'...'',而不是''...「(即unicode)。 – 2009-09-15 20:52:34

+0

如果我傳遞@paramList,是否必須將n'放在@paramList之前,像這樣@paramList = N'@param1 nvarchar(100),@param2 nvarchar(50)' – Xaisoft 2009-09-15 20:54:47

相關問題