将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