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