使用sql脚本更新视图代码的自动方式?

时间:2017-11-13 10:33:19

标签: sql sql-server stored-procedures

假设我有一个包含4列的表A,并且我为同一个表创建了一个包含所有4列的视图。现在我想写一个脚本/存储过程,每当新列以相同的物理顺序添加到表A时,它应该更新视图代码。

例如: 表A包含以下列

'Name','Age','Gender','Address'

假定的视图代码是:

Select Name,Age,Gender,Address from Table A

现在我在表A上添加了一个额外的列PhoneNumber。当我运行脚本/存储过程时,这个新列应该自动添加到查询中,如下所示:

运行脚本后生成的所需视图代码应如下所示:

Select Name,Age,Gender,Address,PhoneNumber from Table A    

4 个答案:

答案 0 :(得分:1)

如果我了解您的要求,那么为什么您需要指定列,而不是将view中的代码更改为:

SELECT * FROM TableA

这样View将始终返回该表中的所有列。

答案 1 :(得分:1)

下面是一个将改变视图的示例,指定一个显式列列表。

DECLARE @AltereViewSQL nvarchar(MAX);
SELECT @AltereViewSQL = N'ALTER VIEW dbo.YourView AS SELECT '
    + STUFF((SELECT ','  + name
    FROM sys.columns
    WHERE 
        object_id = OBJECT_ID(N'dbo.YourTable')
    ORDER BY
        column_id
    FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'), 1, 1, '')
    + ' FROM dbo.YourTable;'

EXEC(@AltereViewSQL);

答案 2 :(得分:1)

希望它会起作用

    DECLARE @tablename as varchar(20)
    DECLARE @query AS NVARCHAR(MAX)
    DECLARE @ColumnName AS NVARCHAR(MAX)
    set @tablename='tableName'
    SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
            + QUOTENAME(COLUMN_NAME)
    FROM ( SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @tablename
                )  as ccc
    set @query='select '+@ColumnName+' from '+@tablename+''
    EXEC (@query)

答案 3 :(得分:1)

附注是在视图中使用select *的注意事项:

REPRO:

CREATE TABLE t (id INT, NAME VARCHAR(10))
GO
INSERT INTO t VALUES (1, 'a')
GO
CREATE VIEW v AS SELECT * FROM t
GO
SELECT * FROM v
GO
ALTER TABLE t ADD d DATE NOT NULL DEFAULT (GETDATE())
GO
ALTER TABLE t DROP COLUMN id
GO
SELECT * FROM v
GO

DROP VIEW v
GO
DROP TABLE t
GO

enter image description here

现在放下这个:

SELECT * FROM v
WHERE id = 3

你会得到

  

转换varchar值时转换失败' a'数据类型int。

而不是invalid object name id。这意味着,在某些情况下,您的解决方案将继续依赖绝对错误的数据

替换' a'在样本数据中使用' 3'要使隐式转换成功并且此代码将起作用,将返回一些数据。虽然从来没有id=3,但在运行此选择时,实际上甚至没有id列。