这听起来像您在存储过程中使用动态SQL,因此您已准备好在SELECT子句中动态创建列列表。
您可以从sys.columns中选择以获取列的列表,并了解该表是否具有标识列。以下是一个查询,显示创建列列表所需的信息。
SELECT c.name, is_identity
FORM sys.columns c
WHERE object_id = object_id('MyTable')
总之,如果is_identity
是1至少一列,你需要包括SET IDENTITY_INSERT
。并且,您将排除SELECT子句中的任何列,其中is_identity
= 1。
而且,此方法将适用于添加到表中的新列。
下面是一个例子
DECLARE @TableName varchar(128) = 'MyTableName'
DECLARE @ColumnName varchar(128)
DECLARE @IsIdentity bit
DECLARE @TableHasIdentity bit = 0
DECLARE @sql varchar(2000) = 'SELECT '
-- create cursor to step through list of columns
DECLARE MyCurs CURSOR FOR
SELECT c.name, is_identity
FROM sys.columns c
WHERE object_id = object_id(@TableName)
ORDER BY column_id
-- open cursor and get first row
OPEN MyCurs
FETCH NEXT FROM MyCurs INTO @ColumnName, @IsIdentity
-- process each column in the table
WHILE @@FETCH_STATUS = 0
BEGIN
IF @IsIdentity = 0
-- add column to the SELECT clause
SET @sql = @sql + @ColumnName + ', '
ELSE
-- indicate that table has identity column
SET @TableHasIdentity = 1
-- get next column
FETCH NEXT FROM MyCurs INTO @ColumnName, @IsIdentity
END
-- cursor cleanup
CLOSE MyCurs
DEALLOCATE MyCurs
-- add FROM clause
SET @sql = LEFT(@sql, LEN(@sql)-1) + CHAR(13) + CHAR(10) + 'FROM ' + @TableName
-- add SET IDENTITY if necessary
IF @TableHasIdentity = 1
SET @sql = 'SET IDENTITY_INSERT ' + @TableName + ' ON' + CHAR(13) + CHAR (10)
+ @sql + CHAR(13) + CHAR (10)
+ 'SET IDENTITY_INSERT ' + @TableName + ' OFF'
PRINT @sql
展鹏? ....... – 2010-08-04 03:38:46
我昨天开始使用RedGate,实际上它帮助了很多。我必须说服我的公司购买一份副本,而且,要指定所有栏目似乎还不够雅观。 – 2010-08-04 10:55:46
我不认为即使是红门也会以这种方式处理模式更改。任何原因你不能使用SSIS?至少它是免费的。 – 2010-08-04 13:19:52