如何使此查询接受动态表名?

时间:2011-05-11 15:03:10

标签: sql sql-server-2008

这是我的函数,它主要将所有行数据汇总成一个字符串。我知道一个名为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

提前致谢:)

2 个答案:

答案 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''

希望这有帮助!