这是我的函数,它主要将所有行数据汇总成一个字符串。我知道一个名为Coallasce的函数可用,但出于好奇,我想知道如何更改此函数以动态接受表名。目前它只从Employee表中读取。
ALTER FUNCTION [dbo].[ConcatStrig]
(
@TableName varchar(64),
@FieldName varchar(64)
)
RETURNS varchar(max)
AS
BEGIN
Declare @Sql as varchar(max) = ''
Set @Sql = 'Select ' + @FieldName + ' from ' + @TableName
Declare curTemp Cursor For
Select EmpName from sp_executesql(@Sql)
Declare @StrTemp as varchar(max)
Declare @String as varchar(max) = ''
Open curTemp
Fetch Next from curTemp into @StrTemp
While @@Fetch_Status = 0
Begin
Set @String = @String + ' ' + @StrTemp
Fetch Next from curTemp into @StrTemp
End
Close curTemp
Deallocate curTemp
Return @String
END
提前致谢:)
答案 0 :(得分:2)
您需要使用dynamic SQL。
这是参数化表名的唯一方法。
答案 1 :(得分:1)
这不完全是您正在寻找的,但它可能会指向您正确的方向。这使用动态sql和一个巧妙的技巧来连接For XML Path('')。
declare @SQL nvarchar(max), @TableName nvarchar(max)
set @TableName='dbo.vwAsset'
set @SQL=(select 'cast(isnull('+name+','''') as nvarchar)+'' ''+'
from sys.columns where object_id=object_id(@TableName)
for XML Path('')
)
set @SQL=LEFT(@SQL,LEN(@SQL)-1)
set @SQL='select '+@SQL+' from '+@TableName
exec sp_ExecuteSQL @SQL,N''
希望这有帮助!