首页 > 解决方案 > 将 SQL 函数设置为变量

问题描述

我想使用设置为以下请求的变量。

SUBSTRING( od.RequestName , LEN(od.RequestName) -  CHARINDEX('.',REVERSE(od.RequestName)) + 2  , LEN(od.RequestName)  );

但是,当我声明并将其设置为变量时,即 ie对 SQL 运行程序来说很奇怪variod

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 

标签: sqlsql-server

解决方案


正如其他朋友提到的,你不能用一个变量来做到这一点。但是你应该使用临时表来方便。

您可以仅为您的基本要求创建一个临时表,以便在任何地方重复使用它。然后,您可以稍后将其删除。我的意思是,您可以将您的要求组合在一个临时表中。或者针对不同要求的不同表格。然后您可以加入其他表。

我使用 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

将这些更改为您的案例。


推荐阅读