sql拼接列字符串

1.使用函数(sql2000以上)

create FUNCTION dbo.fn_dictCodesConcatByType(@filter varchar(1000))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @v varchar(8000) 
select @v =  isnull(@v + ',','')+code FROM dict WHERE type=@filter 
RETURN @v
END
GO

调用如下:

SELECT dbo.dictCodesConcatByType('Status')

 

如果你希望做成通用函数,类似如下:(其实是不可行的)

create FUNCTION dbo.fn_strConcat(@tableName varchar(100),@filedName varchar(100),@filter varchar(1000))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @v varchar(8000),@sqlStr nvarchar(2000) 
SET @v = ''
set @sqlStr=' 
select @val =  isnull(@val + '','','''')+' + @filedName+' FROM '+@tableName+' WHERE '+@filter
 
exec sp_executesql @sqlStr, N'@val varchar(8000) out', @v out 
 
RETURN @v
END
GO

由于Function里不支持  exec / sp_executesql ,所以这个是做不到的

SELECT dbo.fn_strConcat('dict','code','type=''status''')


[Err] 42000 - [SQL Server]只有函数和某些扩展存储过程才能从函数内部执行。

 

只能修改成存储过程方式

create PROC pr_strConcat
@tableName varchar(100),
@filedName varchar(100),
@filter varchar(1000), --不要加where
@r nvarchar(4000) output
AS
DECLARE  @sqlStr nvarchar(2000)  --这里只能用nchar,nvarchar,ntext中一个
 
set @sqlStr='select @val =  isnull(@val + '','','''')+' + @filedName+' FROM '+@tableName+' WHERE '+@filter
print @sqlStr
 
exec sp_executesql @sqlStr, N'@val varchar(8000) output', @r output 

调用如下:

DECLARE @r nvarchar(4000)
exec pr_strConcat 'dict','code','type=''status''',@r output
print @r

 

posted @ 2018-07-31 10:56  zslm___  阅读(4110)  评论(0编辑  收藏  举报