+ -
当前位置:首页 → 问答吧 → sqlserver function不能执行sp_executesql

sqlserver function不能执行sp_executesql

时间:2011-12-13

来源:互联网

现在有个需求,查询一个结果集,其中有个子查询,会返回多条记录,需要把多条记录以“,”分隔显示在一条记录上。
大致思路如下
select a.column1,a.column2,(子查询的funciton) from table_1 a where a.column1=''

因为这类情况很多,function如果写死表名的话会需要写几十个几百个类似的函数,就想用动态sql拼接
但是执行的时候提示说function里不能使用sp_executesql

于是改成存储过程
但是存储过程怎样在查询语句中进行调用呢?

过程如下,执行结果也OK
ALTER PROCEDURE [dbo].[sp_as_unionCommon]
-- Add the parameters for the stored procedure here
@keyValue int,
@relaTableName nvarchar(256),
@relaColumn nvarchar(256),
@relaColumnValue nvarchar(256),
@getColumn nvarchar(256),
@nameTableName nvarchar(256),
@nameColumn nvarchar(256),
@nameRelColumn nvarchar(256),
@outStr nvarchar(max) output
AS
BEGIN
-- Declare the return variable here
DECLARE @SqlStr nvarchar(MAX) = '',
@str nvarchar(MAX) = ''

if @keyValue=0
begin
select @sqlStr ='SELECT @str+='',''+cast (a.' + @getColumn + ' as nvarchar) from ' + @relaTableName + ' a
where a.' + @relaColumn + '=' +@relaColumnValue ;
end
else
begin
select @sqlStr ='SELECT @str+='',''+(select ' + @nameColumn +
' from ' + @nameTableName +
' where ' + @nameRelColumn + '=a.' + @getColumn +
' ) from ' + @relaTableName + ' a
where a.' + @relaColumn + '=' +@relaColumnValue ;
end
EXEC sp_executesql @sqlStr,N'@str nvarchar(max) output',@str=@str output;
SET @outStr = stuff(@str,1,1,'')

END

作者: ymyinying   发布时间: 2011-12-13

函數不支持動態語句

作者: roy_88   发布时间: 2011-12-13

作者: roy_88   发布时间: 2011-12-13

roy_88 我知道函数不支持 ,它错误报了
但是我的问题是我如何能实现那个子查询

作者: ymyinying   发布时间: 2011-12-13

为何不写一个存储过程 到处调用呢

作者: Beirut   发布时间: 2011-12-13

beirut我写了个存储过程
但是不知如何在子查询语句里调用

作者: ymyinying   发布时间: 2011-12-13

直接用存储过程调用存储过程 新建立一个临时表 然后

insert into #tb exex(@sql)

作者: fredrickhu   发布时间: 2011-12-13

fredrickhu主要我这个过程的入参是不定的
是存在一个select子查询里的
最后返回的是这个select结果集。。。

作者: ymyinying   发布时间: 2011-12-13

你的想法很多人都有过,实现不了,不用想了。老实写N个函数吧。

作者: guguda2008   发布时间: 2011-12-13

guguda2008 完全实现不了吗?
哭~~~

作者: ymyinying   发布时间: 2011-12-13

引用 5 楼 ymyinying 的回复:

beirut我写了个存储过程
但是不知如何在子查询语句里调用

那真的无解了

作者: Beirut   发布时间: 2011-12-13

也许clr 函数可以解决。。。

作者: Beirut   发布时间: 2011-12-13

哭~~~~~~~~~~~~~~~~

作者: ymyinying   发布时间: 2011-12-13

Beirut 网上搜了下貌似可以耶
不过不晓得公司允不允许这么做,我去问问

作者: ymyinying   发布时间: 2011-12-13

改成存储过程看看

作者: szstephenzhou   发布时间: 2011-12-13