2015-09-03 40 views
1

我正在執行查詢,希望從已除去所有前導空間和後續空格的字符串中提取最左側的n個字符。一個例子是:使用MS SQL Server在ColdFusion中創建SQL用戶定義的函數

Select SUBSTRING(LTRIM(RTRIM(somefield)), 0, @n) AS mydata 
FROM sometable 

這是我能想到在SQL Server上完成的唯一方法。

我以前從未編寫過一個UDF,但我想,如果我只是一個SQL Server上的工作,我可以創建一個用戶定義的函數,例如:

CREATE FUNCTION udfLeftTrimmed 
(
    @inputString nvarchar(50), 
    @n int 
) 
RETURNS nvarchar(@n) 
AS 
BEGIN 
    RETURN SUBSTRING(LTRIM(RTRIM(@inputString)), 0, @n); 
END 

然後我可以做這樣的事情:

Select udfLeftTrimmed(somefield,6) AS mydata 
FROM sometable 

這是至少有點容易閱讀和理解。

問題是,我如何在ColdFusion中創建UDF?我在ColdFusion中對SQL用戶定義函數的所有搜索只是給了我如何創建ColdFusion函數。

+1

您可以通過在ColdFusion中使用''標籤執行CREATE FUNCTION ...語句來簡單地創建MSSQL函數。 – Alex

+0

我會將數據源放在什麼位置?它不會接受空的或沒有數據源 - 導致錯誤。另外,我會用cfquery名稱還是函數名稱來調用它? – abalter

+2

您可以使用指向要創建函數的數據庫的數據源。我並不認爲當您提出第二個問題時,您會發現''有效。它只是一個將SQL語句傳遞給數據庫的機制。 'name'屬性給出標籤,當做SELECT查詢時,記錄集被DB返回時,CF有一個變量名用來引用它。在傳遞「CREATE FUNCTION」語句時,您甚至不會使用'name'屬性,因爲它不會返回任何有用的內容。一旦在DB *中創建函數*,那麼您可以在您的''標籤中的SQL .. –

回答

2

由於沒有什麼特別的或「動態的」關於你的UDF你真的不需要在CF中創建它。您應該使用MSSQL Manager創建它。 SQL中的UDF就像存儲過程一樣。一旦創建,它們就是DB/Schema的一部分。所以請創建一次,儘可能多地使用(如@leigh所述)。

請記住,使用SQL中的SQL UDF通常需要用戶預先準備爲:

<cfquery...> 
Select dbo.udfLeftTrimmed(somefield,6) AS mydata 
FROM sometable 
</cfquery> 

注意「dbo.udf ......」這是DBO重要,可爲什麼你隨後嘗試失敗 - 除了現在獲得重複的UDF錯誤。 :)

注:

要在您的意見和Leighs跟進,你可以在你的用戶訪問的DB創建UDF,然後訪問它dbo.dbname.function ......如在礦井下面的代碼:

<cfquery...> 
Select dbo.myspecialDatabase.udfLeftTrimmed(somefield,6) AS mydata 
FROM sometable 
</cfquery> 

然後您只需要創建一次。

+0

@abalter - 是的,* SQL * UDF的確是一個dbms的概念。 (完全不同於CFML UDF)。恰巧你可以使用cfquery創建SQL udf,但是...他們仍然是db對象。因此,您通常通過SSMS創建它們,而不是CF.因此,爲什麼你的搜索可能沒有得到很多結果。 *注意「dbo.udf ...」*是的,其中「dbo」是模式名稱。有關更多詳細信息,請參閱[用戶定義的函數](https://msdn.microsoft.com/zh-cn/library/ms191007.aspx)。 – Leigh

相關問題