【问题标题】:Dynamic SQL with varchar in replace of table variable用 varchar 替换表变量的动态 SQL
【发布时间】:2015-07-06 21:21:04
【问题描述】:

我对 Dynamic SQL 和一般的 SQL Server 还是很陌生,但我想遍历 information_schema.tables 中的一个表列表。每次迭代都有一个 varchar 变量列出要在表名 (where table_name like concat('USA_RETHHDs_%', @Month)) 中搜索的月份-年份。

然后,每个具有匹配日期的表都将被放入一个varchar 变量中。问题是,我想从information_schema.tables 列表中获取table 变量,但我不确定如何做到这一点。结果,我尝试走动态路线,将varchar 变量嵌入到动态SQL 查询中。但是,它需要一个table 变量而不是varchar

declare @Month varchar(6)
declare @Table varchar(32)
declare @sql nvarchar(max)
declare @MonthCount int

while @MonthCount > 0
    begin
        select @Month = DateSuffix from @DateTable where Row = @MonthCount
        select @Table = table_name from information_schema.tables where table_name like concat('USA_RETHHDs_%', @Month)
        select @Table = concat('dbo.', @Table)
        set @sql = 'select * from @Table'
        execute SP_EXECUTESQL @sql  

        select @MonthCount = @MonthCount - 1
    end

【问题讨论】:

    标签: sql-server dynamic-sql table-variable


    【解决方案1】:

    试试

    set @sql = 'select * from ' + @Table
    execute SP_EXECUTESQL @sql  
    

    我还应该提到,您可以在 sp_executesql 调用中包含参数

    DECLARE @Month VARCHAR(6)
    DECLARE @Table VARCHAR(32)
    DECLARE @sql NVARCHAR(MAX)
    DECLARE @MonthCount INT
    DECLARE @ParmDefinition NVARCHAR(500);
    
    
    WHILE @MonthCount > 0 
        BEGIN
            SELECT  @Month = DateSuffix
            FROM    @DateTable
            WHERE   Row = @MonthCount
    
            SELECT  @Table = table_name
            FROM    information_schema.tables
            WHERE   table_name LIKE CONCAT('USA_RETHHDs_%',@Month)
    
            SELECT  @Table = CONCAT('dbo.',@Table)
    
            SET     @sql = N'select * from @param '
            SET     @ParmDefinition = N'@param varchar(500)'
    
            EXECUTE SP_EXECUTESQL @sql, @ParmDefinition, @param = @Table
    
            SELECT  @MonthCount = @MonthCount - 1
        END
    

    【讨论】:

    • 太棒了!比我想象的要容易得多。谢谢杰米!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多