我正在尝试为列(Inserted_time)设置默认值,但是首先我需要检查表中是否存在该列。如果该列不存在,则需要添加该列并为其提供默认值。我正在使用Sql Server Management Studio。到目前为止,我已经编写了以下代码:
IF EXISTS ( select TABLE_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG = 'DB_COPY' and COLUMN_NAME = 'Inserted_Time')
begin
ALTER TABLE table_name ADD CONSTRAINT [Inserted_Time_Def] SET DEFAULT (sysdatetimeoffset()) FOR [Inserted_Time]
end
else
ALTER TABLE table_name ADD COLUMN [Inserted_Time] CONSTRAINT [Inserted_Time_Def] DEFAULT (sysdatetimeoffset()) WITH VALUES
一旦检索到具有该列的表,我需要将该table_name添加到Alter命令。但我无法做到这一点。有人可以告诉我如何使用alter语句中从select语句检索的table_names吗?
首先,您希望将所有表名放在一个临时表中,以便您可以循环浏览它。
之后,您可以使用光标为每个表名称执行命令。
在我的示例中,我只打印了我想执行的命令。这样,您可以确定代码将首先执行您想要的操作。
示例:
select TABLE_NAME As TableName INTO #TablesList from INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG = 'DB_COPY' and COLUMN_NAME = 'Inserted_Time'
DECLARE @TablesCursor as CURSOR;
DECLARE @TableName as NVARCHAR(max);
DECLARE @CommandToExecute as NVARCHAR(max);
SET @TablesCursor = CURSOR FOR SELECT TableName FROM #TablesList;
OPEN @TablesCursor;
FETCH NEXT FROM @TablesCursor INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @CommandToExecute = 'ALTER TABLE ' + @TableName + ' WHAT YOU WANNA DO '
PRINT @CommandToExecute
--EXEC(@CommandToExecute)
FETCH NEXT FROM @TablesCursor INTO @TableName;
END
CLOSE @TablesCursor;
DEALLOCATE @TablesCursor;
假定每个表都在不同的架构中,那么您可以执行以下操作:
DECLARE @SQL nvarchar(MAX);
SET @SQL = STUFF((SELECT NCHAR(13) + NCHAR(10) +
CASE WHEN EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE T.TABLE_SCHEMA = C.TABLE_SCHEMA
AND T.TABLE_NAME = C.TABLE_SCHEMA
AND C.COLUMN_NAME = N'Inserted_Time') THEN N'ALTER TABLE ' + QUOTENAME(T.TABLE_SCHEMA) + N'.' + QUOTENAME(T.TABLE_NAME) + N' ADD CONSTRAINT [Inserted_Time_Def] DEFAULT (sysdatetimeoffset()) FOR [Inserted_Time];'
ELSE N'ALTER TABLE ' + QUOTENAME(T.TABLE_SCHEMA) + N'.' + QUOTENAME(T.TABLE_NAME) + N' ADD COLUMN [Inserted_Time] CONSTRAINT [Inserted_Time_Def] DEFAULT (sysdatetimeoffset());'
END
FROM INFORMATION_SCHEMA.TABLES T
WHERE T.TABLE_CATALOG = N'DB_COPY'
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,2,N'');
PRINT @SQL; --Your best friend. If more than 4,000 characters, use SELECT
EXECUTE sp_executesql @SQL;
如果您有很多模式,这很可能会极大地执行CURSOR
解决方案。