SQL Server:表值函数不适用于子查询
Posted
技术标签:
【中文标题】SQL Server:表值函数不适用于子查询【英文标题】:SQL Server : table-valued function does not work with sub query 【发布时间】:2012-08-08 11:57:35 【问题描述】:我有一个由我创建的 SQL Server 表值函数,我在下面粘贴了创建脚本
CREATE FUNCTION [dbo].[getTableFromString]
(
@String AS nvarchar(max)
)
RETURNS @ReturnTable TABLE ( StringValues nvarchar(10) )
AS begin
if (SELECT CHARINDEX(',', @String)) = 0
begin
insert into @ReturnTable (StringValues) values (subString(@String,1,len(@String)));
end
else
begin
while (SELECT CHARINDEX(',', @String)) > 0
begin
insert into @ReturnTable (StringValues) values (subString(@String,1,CHARINDEX(',', @String)-1));
set @String = subString(@String,CHARINDEX(',', @String)+1,len(@String));
if (SELECT CHARINDEX(',', @String)) = 0
begin
insert into @ReturnTable (StringValues) values (subString(@String,1,len(@String)));
end
end
end
return ;
end
我正在使用这个功能,如下所示
Select sum(NetSales)
from vwxsalesall
where Company = 'rs'
and storecode = (select cPrimaryStockRoomCode from CompanyMaster.CompanyProfileDetail where cCompanyNo = 'rs' and cSecondaryStockRoomCode = 'R01B')
and trandate >= '2012-01-01'
and trandate <= '2012-01-31'
and (
brand in (
select StringValues from dbo.getTableFromString(
select vIncludedBrandCodes
from StockRoomTargetData.MonthlyTarget
where cCompanyNo = 'rs'
and cSecondaryStockRoomCode = 'R01B'
and nYear = 2012
and nMonth = 8
)
)
)
不幸的是我收到了这个错误
消息 156,第 15 级,状态 1,第 10 行 关键字“select”附近的语法不正确。 消息 102,第 15 级,状态 1,第 16 行 ')' 附近的语法不正确。
请帮帮我
【问题讨论】:
您需要将select vIncludedBrandCodes ...
子查询放在括号中,以向Sql Server 表明这实际上是一个子查询。
你能解释一下吗?
请看我的回答。
【参考方案1】:
例如,您需要在子查询周围添加另一组括号
select StringValues from dbo.getTableFromString(( your-subquery ))
^ ^
(parenthesis added)
第一组括号在语法上属于 TVF 调用,第二组表示子查询。
现在您的查询:
Select sum(NetSales)
from vwxsalesall
where Company = 'rs'
and storecode = (select cPrimaryStockRoomCode from CompanyMaster.CompanyProfileDetail where cCompanyNo = 'rs' and cSecondaryStockRoomCode = 'R01B')
and trandate >= '2012-01-01'
and trandate <= '2012-01-31'
and (
brand in (
select StringValues from dbo.getTableFromString((
select vIncludedBrandCodes
from StockRoomTargetData.MonthlyTarget
where cCompanyNo = 'rs'
and cSecondaryStockRoomCode = 'R01B'
and nYear = 2012
and nMonth = 8
))
)
)
【讨论】:
Msg 102, Level 15, State 1, Line 10 '(' 附近的语法不正确。Msg 102, Level 15, State 1, Line 17 ')' 附近的语法不正确。 @Prabhakantha 它对我有用,see it yourself。您使用的是哪个版本的 Sql Server? @Prabhakantha 如果您当前的查询仍然无法正常工作,您能否发布一下? 我正在使用兼容级别为 80 的 sql 2005,我无法更改数据库中的兼容级别,因为某些报告进入了不工作状态:'( @Nicola 我刚刚粘贴了您的查询,因为您使用的是相同的表名,它应该对我有用:)以上是关于SQL Server:表值函数不适用于子查询的主要内容,如果未能解决你的问题,请参考以下文章