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