2017-04-06 146 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