从视图填充或创建表的SQL Server过程 - 性能问题

时间:2016-11-22 16:30:58

标签: sql sql-server performance cursor

我编写了以下代码来填充/创建数据库中所有相应视图(t_)的表(v_)。我使用游标转换了以前的脚本以提高运行速度。还有什么我可以做的让这个表现更好吗?

感谢任何帮助。

请参阅我的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[P_populate_tables_from_views] 
    @dropTables BIT
AS
    DECLARE @viewName NVARCHAR(100);
    DECLARE @formattedTableName NVARCHAR(100);
    DECLARE @dropTableSql NVARCHAR(MAX);

    DECLARE @viewId int

    SET @viewId = (SELECT MIN(object_id) FROM sys.views)

    WHILE @viewId IS NOT NULL
    BEGIN
        SET @viewName = (SELECT name FROM sys.views WHERE object_id = @viewId)

        PRINT 'Time: ' + CONVERT(varchar, SYSDATETIME(), 121)
        PRINT('Processing ' + @viewName)

        SET @formattedTableName = REPLACE(@viewName,'v_','t_');

        IF @dropTables = 1
        BEGIN
            SET @dropTableSql = 'IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '''+@formattedTableName+''')) DROP TABLE '+@formattedTableName
            EXEC (@dropTableSql);
        END

        IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @formattedTableName))
        BEGIN
            EXEC('TRUNCATE TABLE '+@formattedTableName)
            EXEC('INSERT INTO '+@formattedTableName +' SELECT * FROM '+ @viewName) 
        END
        ELSE
        BEGIN
            EXEC ('SELECT * INTO '+@formattedTableName+' FROM '+@viewName);
        END

        SET @viewId = (SELECT MIN(object_id) 
                       FROM sys.views 
                       WHERE object_id > @viewId)
END

1 个答案:

答案 0 :(得分:0)

  1. 将@sql声明为nvarchar(max)=''
  2. SELECT @sql = @sql +'
  3. IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ['+ REPLACE(name,'v _','t_')+'])
  4. BEGIN
  5. TRUNCATE TABLE ['+ REPLACE(name,'v _','t_')+']
  6. INSERT INTO'+ REPLACE(name,'v _','t_')+'SELECT * FROM'+ name +'
  7. END
  8. ELSE
  9. SELECT * INTO'+ REPLACE(name,'v _','t_')+'FROM'+ name + char(10)
  10. FROM sys.views
  11. print @sql
  12. EXEC(@sql)