【问题标题】:How can I make this query to accept dynamic table names?如何使此查询接受动态表名?
【发布时间】:2011-05-11 23:14:45
【问题描述】:

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

提前致谢:)

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    您需要使用dynamic SQL

    这是参数化表名的唯一方法。

    【讨论】:

      【解决方案2】:

      这并不完全是您正在寻找的内容,但它可能会为您指明正确的方向。这在 For XML Path('') 中使用了动态 sql 和巧妙的连接技巧。

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

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        相关资源
        最近更新 更多