2013-03-06 83 views
0

我們有許多存儲過程需要對錶中的列執行字符串操作。使用SQL Server中的函數進行字符串操作

我可以創建一個函數來執行字符串操作並從SP調用它嗎?如果是的話,我會怎麼做?

例子:

我有一個名爲 '名' 表中,並有一個名爲 '可採用DocName'

我的SP看起來像一列:

select DocName, MyStrFunc(DocName) as NewName 
FROM Names 

MyStrFunc將調整通過值並返回一個字符串。

我們將有許多SP需要使用MyStrFunc並且不想複製字符串操作代碼。

+0

一個例子,請閱讀https://www.simple-talk.com/sql/t-sql-programming/sql-server-functions-the-basics/並關閉你的問題。 – RandomUs1r 2013-03-06 19:06:57

+0

我相信你現在的問題可以概括爲「我可以在SQL Server中創建一個用戶定義的函數嗎?」答案是[是](http://msdn.microsoft.com/en-us/library/ms186755.aspx),因爲即使是粗略的研究也會告訴你。如果您想知道如何執行特定的字符串操作,請首先[請閱讀文檔](http://msdn.microsoft.com/zh-cn/library/ms181984.aspx),嘗試自己查找解決方案,並在這裏發帖,如果你卡住了。 – Pondlife 2013-03-06 19:16:28

+0

不,這不是問題。我知道可以創建UDF。我發現的所有例子都不僅僅是簡單的字符串操作,即它們返回表的子集。 – bluesixty 2013-03-06 22:42:04

回答

4

這是一個帶user-defined function

CREATE FUNCTION dbo.StringConverter 
(
    @oldValue varchar(100) 
) 
RETURNS varchar(100) 
AS 
BEGIN 
    DECLARE @Result varchar(100) 
    -- do your custom manipulation here. this is just an example 
    SELECT @Result = upper(@oldValue) 
    RETURN @Result 
END 
GO 

-- and to use it 
SELECT x.a as src, dbo.StringConverter(x.a) as converted 
FROM (
    SELECT 'asdf' as a 
    ) as x 

-- results 
src converted 
asdf ASDF 
+0

不錯的例子! +1 – Kaf 2013-03-06 19:31:05

+0

完美。謝謝 :) – bluesixty 2013-03-06 22:42:28

0

您不能在SQL中擁有動態列名稱。

實現此目的的唯一方法是使用dynamic SQL,它有其自身的危險(其中SQL Injection是最重要的)。

3

你想要的是一個標量值函數。要創建其中之一,請轉到SSMS中的Object Explorer,打開數據庫,打開Programmability文件夾,然後打開Functions文件夾。在Scalar-Valued Functions文件夾上單擊鼠標右鍵,然後單擊「New Scalar-value function」。

這會給你你需要創建函數的shell。那麼你應該能夠從任何地方調用該功能。

您的標量值函數需要將varchar或nvarchar作爲輸入 - 而不是列名稱。