将SQL函数设置为变量

将SQL函数设置为变量,sql,sql-server,Sql,Sql Server,我想对以下请求使用一个变量集 SUBSTRING( od.RequestName , LEN(od.RequestName) - CHARINDEX('.',REVERSE(od.RequestName)) + 2 , LEN(od.RequestName) ); 但是,当我声明并将其设置为变量时,即vari,od,对于SQL运行程序来说是很奇怪的 declare @vari varchar(100) set @vari = SUBSTRING( od.RequestName , LEN

我想对以下请求使用一个变量集

SUBSTRING( od.RequestName , LEN(od.RequestName) -  CHARINDEX('.',REVERSE(od.RequestName)) + 2  , LEN(od.RequestName)  );
但是,当我声明并将其设置为变量时,即
vari
od
,对于SQL运行程序来说是很奇怪的

declare @vari varchar(100)
set @vari = SUBSTRING( od.RequestName , LEN(od.RequestName) -  CHARINDEX('.',REVERSE(od.RequestName)) + 2  , LEN(od.RequestName)  );

SELECT
r.name, p.PageName, @vari
  FROM restable r WITH (NOLOCK) 
       JOIN pestable p WITH (NOLOCK)  ON p.ResourceId = r.ResourceId 
       JOIN odtable od ON od.ResourceCode = p.ResourceCode 
然而,下面的工作

SELECT
r.name, p.PageName,  
SUBSTRING( od.RequestName , LEN(od.RequestName) -  CHARINDEX('.',REVERSE(od.RequestName)) + 2  , LEN(od.RequestName)  )
  FROM restable r WITH (NOLOCK) 
       JOIN pestable p WITH (NOLOCK)  ON p.ResourceId = r.ResourceId 
       JOIN odtable od ON od.ResourceCode = p.ResourceCode 

你不能像其他朋友提到的那样只用一个变量。但是你应该用桌子来让它更容易

您可以仅为这些基本需求创建临时表,这样您就可以在任何地方重用它。然后您可以稍后删除它。我的意思是,你可以在一个临时表格中组合你的需求。或根据不同的要求使用不同的表格。然后您可以加入到另一个表

我使用了著名的Northwind db,以便更容易理解。首先,创建一个临时表

create table #temp(
     CategoryId     int
    ,name           nvarchar(50)
    ,length         int
    /*columns for your requirements*/)   
其次,您可以使用所需的函数来填充它,如
substring()、len()
或其他函数

insert into #temp
select 
     prod.CategoryID
    ,substring(prod.ProductName,1,3) as name
    ,len(prod.ProductName)           as length        
from Products                        as prod
    /*join to different tables too*/
然后,你可以随心所欲地使用它

select 
     t.*
    ,c.CategoryName
from Categories     as c
inner join #temp    as t on c.CategoryID = t.CategoryId

最后,您可以删除它或根据任务进行更改。

您不能像其他朋友提到的那样只使用一个变量。但是你应该用桌子来让它更容易

您可以仅为这些基本需求创建临时表,这样您就可以在任何地方重用它。然后您可以稍后删除它。我的意思是,你可以在一个临时表格中组合你的需求。或根据不同的要求使用不同的表格。然后您可以加入到另一个表

我使用了著名的Northwind db,以便更容易理解。首先,创建一个临时表

create table #temp(
     CategoryId     int
    ,name           nvarchar(50)
    ,length         int
    /*columns for your requirements*/)   
其次,您可以使用所需的函数来填充它,如
substring()、len()
或其他函数

insert into #temp
select 
     prod.CategoryID
    ,substring(prod.ProductName,1,3) as name
    ,len(prod.ProductName)           as length        
from Products                        as prod
    /*join to different tables too*/
然后,你可以随心所欲地使用它

select 
     t.*
    ,c.CategoryName
from Categories     as c
inner join #temp    as t on c.CategoryID = t.CategoryId
最后,您可以删除它或根据任务进行更改。

这就是您想要的吗

declare @vari varchar(100)

set @vari = (select SUBSTRING( od.RequestName , LEN(od.RequestName) -  
CHARINDEX('.',REVERSE(od.RequestName)) + 2  , LEN(od.RequestName)  )

FROM odtable od )
这是你想要的吗

declare @vari varchar(100)

set @vari = (select SUBSTRING( od.RequestName , LEN(od.RequestName) -  
CHARINDEX('.',REVERSE(od.RequestName)) + 2  , LEN(od.RequestName)  )

FROM odtable od )

变量是值而不是宏。它不是代码的替换,因此不能为其指定任意表达式。提示:
set@vari=SUBSTRING(…)
从何处开始?SQL Server不知道od.RequestName从何而来变量没有注入到代码中,SQL不像Powershell或Bash那样是一种脚本语言,它是一种查询语言。对于您拥有的变量,它将被指定一个标量值,而不是稍后计算的表达式。但是,对于您拥有的第一条语句,该语句将失败,因为
od。RequestName
在赋值语句中没有上下文。@GordonLinoff那么我该如何实现这一点呢?@Larnu-hmm,感谢您深入了解基本点。此外,如何实现这一点?变量是一个值,而不是宏。它不是代码的替换,因此不能为其指定任意表达式。提示:
set@vari=SUBSTRING(…)
从何处开始?SQL Server不知道od.RequestName从何而来变量没有注入到代码中,SQL不像Powershell或Bash那样是一种脚本语言,它是一种查询语言。对于您拥有的变量,它将被指定一个标量值,而不是稍后计算的表达式。但是,对于您拥有的第一条语句,该语句将失败,因为
od。RequestName
在赋值语句中没有上下文。@GordonLinoff那么我该如何实现这一点呢?@Larnu-hmm,感谢您深入了解基本点。此外,我如何才能做到这一点?谢谢                              ˘ ˘ ˘ ˘ ˘ ˘ ˘ ˘ ˘                                      你+1谢谢                              ˘ ˘ ˘ ˘ ˘ ˘ ˘ ˘ ˘                                      你+1