2011-05-10 26 views
4

在SQL Server中可以定義一個String常量嗎?我正在重寫一些查詢以使用存儲過程,並且每個都與IN語句[a],[b],[c]等部分具有相同的長字符串。在SQL Server中定義一個字符串常量?

預期不會更改,但可能會未來的一點。它也是一個非常長的字符串(幾百個字符),所以如果有一種方法可以爲此定義一個全局常量,這將更容易處理。

如果這是可能的,我也有興趣知道它在這種情況下是否有效。我試圖將這個String作爲參數傳遞,所以我可以從應用程序中的單個點控制它,但是存儲過程不喜歡它。

回答

4

您可以創建一個具有單列和行的表,並且不允許對其寫入。

使用它作爲全局字符串常量(或其他常量,如果您願意的話)。

0

除了字符串常量表作爲烏迪德暗示的,我已經使用標量函數來封裝一些常數。當然,這對於較少的常量會更好,但它們的使用很簡單。

也許是一種組合 - 字符串常量表與一個函數接受一個鍵並返回字符串。你甚至可以使用它來進行本地化,方法是讓該函數獲得一個「區域」,並將其與一個鍵合併以返回不同的字符串!

1

你問一件事(字符串在MS SQL不變),但似乎可能需要別的東西。我之所以這麼說是因爲你已經給出了一些提示,說明你的最終目標是多個存儲過程中使用相同的IN子句。

最大的線索是在最後一句:

我曾試圖通過這個字符串作爲 參數,這樣我就可以從 一個點我的應用程序 但存儲過程沒內控制它不喜歡 它。

沒有你的SQL腳本的細節,我將嘗試使用一些psychic debugging技術,看看是否我可以給你什麼,我相信是你的實際目標,不一定是你的既定目標。

鑑於你的存儲過程「不喜歡,」當你想在一個字符串作爲參數傳遞,我猜測的字符串組成只是值的分隔列表,類似「10293,105968, 501940「或」果汁,牛奶,甜甜圈「(不注意實際列表值 - 重要部分是分隔列表本身)。而你的SQL可能看起來是這樣的(再次,忽略了具體的名字,並專注於一般概念):

SELECT Column1, Column2, Column3 
FROM UnknownTable 
WHERE Column1 IN (@parameterString); 

如果這大約描述你試圖採取的路徑,那麼你就需要重新考慮你的方法。使用普通的T-SQL語句,你將無法對參數值的字符串傳遞給IN子句 - 它只是不知道他們做什麼。

還有其他選擇,但是:

  1. Dynamic SQL - 你可以建立起來 整個SQL語句,參數和 所有,然後執行,在SQL數據庫 。這可能不是你正在嘗試實現的 ,因爲你的 正在將腳本移動到存儲的 程序中。但爲了完整性,此處列出了 。

  2. 值表 - 您可以創建一個單列表 保存您 感興趣的特定值,那麼您的存儲 過程可以簡單地從該表中使用的列 IN子句)。 這樣,就不需要動態SQL 。由於您指示 的值不可能發生變化,因此您可能只需填寫一次 表,並在適當的地方使用它。

  3. String Parsing到 得出的值的列表 - 您可以通過 值列表作爲一個字符串,然後 執行代碼來解析 列表分爲上 飛表結構。這種 技術的另一種形式是傳遞包含值的XML 結構,並且 使用MS SQL Server的XML 功能來派生該表。

  4. 定義表值函數 返回值來使用 - 我已經 沒有試過這一個,所以我可能是 失去了一些東西,但是你應該 能夠在 表 - 定義值值函數(可能使用 一些UNION語句或 東西),並在IN子句中調用該函數 。再次 - 這是一個 未經測試的建議,並需要通過 來確定 這是可行的。

我希望有幫助(假設我已經猜到了你的潛在困惑)。

以供將來參考,這將是非常有益的,如果你能包括顯示 你的表結構的SQL腳本和存儲過程的邏輯,我們可以看到你有什麼實際上嘗試。這將顯着提高您收到的答案的有效性。謝謝。

P.S.字符串解析的鏈接實際上包含大量將信息傳遞給存儲過程的數組(即列表)的技術 - 這對於這類事情來說是非常好的資源。

相關問題