2017-04-06 71 views
0

有人可以解釋爲什麼我們需要在下面的代碼中聲明一個變量@work嗎?SQL函數中的變量賦值

CREATE FUNCTION dbo.GetURL (@URL VARCHAR(250)) 
    RETURNS VARCHAR(250) 
    AS BEGIN 
     DECLARE @Work VARCHAR(250) 

     SET @Work = @URL 
     SET @Work = SUBSTRING(@work, CHARINDEX('.', @work) + 1, LEN(@work)) 
     SET @Work = SUBSTRING(@work, 0, CHARINDEX('.', @work)) 
     RETURN @work 
    END 

我們可以像下面那樣重新構建代碼嗎?如果不是,請以更通俗的語言解釋。

CREATE FUNCTION dbo.GetURL (@URL VARCHAR(250)) 
    RETURNS VARCHAR(250) 
    AS BEGIN 
     SET @URL = SUBSTRING(@URL, CHARINDEX('.', @URL) + 1, LEN(@URL)) 
     SET @URL = SUBSTRING(@URL, 0, CHARINDEX('.', @URL)) 
     RETURN @URL 
    END 
+5

你試過了嗎? – jarlh

+0

兩者都是一樣的。 –

+0

基本上它是一樣的東西.. –

回答

1

兩個代碼片段在功能上是等價的。唯一的區別是第一個代碼片段正在創建@URL原始值的副本,然後修改副本變量@Work以代替修改原始參數本身。通過這種方式,您可以將參數的原始值用於您的功能,直至最終需要以後用於比較或任何其他工作。

只要您不打算在函數中再次使用該參數的原始值,就沒有必要創建它的副本。

我相信你的重構努力是正確的。你應該使用第二個代碼片段作爲你的函數的新定義。

-1

你聲明的變量@Work大寫W.但在這部分

SET @Work = SUBSTRING(@work, CHARINDEX('.', @work) + 1, LEN(@work)) 

您使用小寫W上的@Work變量。只需將其改爲大寫W即可使用。

+0

sql是大小寫不敏感的,所以這不是問題。 –

+0

@HansKesting SQL-Server絕對區分大小寫。我只是試了一下,SQL-Server會要求你聲明變量,如果你聲明的時候是小寫的,當你使用它的時候是大寫的。 – Koruba

+0

不是我的經驗:當您嘗試聲明'@ test'和'@ TEST'時,Sql Azure和Sql Express都會抱怨這個變量已經被聲明。 –

1

你的功能只是簡單地讓你的URL的第二個(。),如

thisis.my.url 

給出的,returnmy

按你的問題的結果

我們能否重新構建下面的代碼?

我的回答是Yes