假设我有一个包含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
答案 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
现在放下这个:
SELECT * FROM v
WHERE id = 3
你会得到
转换varchar值时转换失败' a'数据类型int。
而不是invalid object name id
。这意味着,在某些情况下,您的解决方案将继续依赖绝对错误的数据!
替换' a'在样本数据中使用' 3'要使隐式转换成功并且此代码将起作用,将返回一些数据。虽然从来没有id=3
,但在运行此选择时,实际上甚至没有id
列。