【问题标题】:How to create view for all tables in database?如何为数据库中的所有表创建视图?
【发布时间】:2014-04-22 20:25:47
【问题描述】:

我想从数据库中已经存在的所有表中创建视图,这是一项艰巨的任务,很难逐个捕获表并将创建视图 XXXX 作为 select * from Table_name 。我发现光标可以实现一些功能,代码是:

DECLARE @TableName sysname
DECLARE @ColumnCount INT
DECLARE @ColumnID INT
DECLARE @SelectColumn NVARCHAR(500)
DECLARE @sql NVARCHAR(max) = ''

DECLARE QUERYINFO CURSOR FOR
    SELECT
        t.name AS TableName,
        ccount.ColumnCount,
        c.column_id AS ColumnID,
        CASE WHEN c.column_id <> ccount.ColumnCount
                THEN c.name + ', '
             ELSE c.name
             END AS SelectColumn
    FROM sys.tables t
    INNER JOIN sys.columns c ON t.object_id=c.object_id
    INNER JOIN (
        SELECT object_id,COUNT(*) AS ColumnCount
        FROM sys.columns
        GROUP BY object_id
    ) ccount ON t.object_id = ccount.object_id
    ORDER BY t.Name,c.column_id

OPEN QUERYINFO
FETCH NEXT FROM QUERYINFO INTO @TableName,@ColumnCount,@ColumnID,@SelectColumn
WHILE @@FETCH_STATUS = 0
BEGIN
    IF @ColumnID = 1
    BEGIN
        SET @sql = 'CREATE VIEW v_' + @TableName + ' AS SELECT ' + @SelectColumn
    END
    ELSE
    BEGIN
        SET @sql = @sql + @SelectColumn
    END 

    IF @ColumnID = @ColumnCount
    BEGIN
        SET @sql = @sql + ' FROM ' + @TableName
        EXEC sys.sp_executesql @sql
        SET @sql = ''
    END

    FETCH NEXT FROM QUERYINFO INTO @TableName,@ColumnCount,@ColumnID,@SelectColumn
END

CLOSE QUERYINFO
DEALLOCATE QUERYINFO

但它有错误,我不知道如何解决它

【问题讨论】:

  • 嘿!欢迎来到 StackOverflow。我继续格式化您的代码,使其显示得更好。为了让您的问题得到最好的关注,您应该单击edit 链接并至少输入您正在使用的SQL 版本的标签。就像现在一样,它可能会迷失在噪音中,因为有些人只寻找带有特定标签的问题。
  • 我从不使用游标,所以我对您的代码无能为力,但要小心在视图定义中使用“select *”。如果您向表中添加一列,视图会显示一些意想不到的内容。正确的视图应该定义为 select columnA, columnB... 而不是 *.
  • @avb: 视图定义中的select * 将在视图创建期间扩展到列列表。不是每次使用视图都解决。
  • @a_horse_with_no_name:尝试创建这样的视图,然后“脚本视图作为 alter”,你会得到“select *”。我花了一整天的时间试图找出为什么其中一个视图突然开始选择奇怪的值。事实上,它使用先前视图中最后一列的名称重新使用添加到基础表的列中的值。

标签: tsql view


【解决方案1】:

这就是我对动态 SQL 所做的;首先检查视图是否存在,然后使用所有列创建它(而不是使用SELECT * FROM...)。

DECLARE @SQL nvarchar(MAX)
SET @SQL = N''


SELECT
    @SQL = @SQL + 
    N'IF EXISTS(SELECT 1 FROM sys.objects WHERE name = N''v_' + t.name + N''' AND type = N''V'') BEGIN DROP VIEW [v_' + t.name + '] END CREATE VIEW [v_' + t.name + N'] AS SELECT ' + 
        STUFF(
            (SELECT N',' + c.name
               FROM
                  sys.columns AS c
               WHERE 
                 c.OBJECT_ID = t.OBJECT_ID
               ORDER BY
                 column_id
               FOR XML PATH(''), TYPE).value('.',N'nvarchar(max)')
        ,1,1,N'')
        + N' FROM [' + t.name + N'];'
FROM
    sys.tables AS t

EXEC sp_executesql @SQL

【讨论】:

  • MySQL怎么样?
  • @PrzemyslawRemin,我不知道。我只有在 SQL Server 中工作的经验。
  • 如果您有多个架构,请小心。过滤它们或在 FROM 子句中包含架构名称
  • 我必须在“创建视图”(和 CR/LF)之前和之后添加“go”语句。 SQL 2014。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多