更新数据库表时出现错误 "Incorrect syntax near the keyword 'SET'."
Getting error "Incorrect syntax near the keyword 'SET'." while Updating the db tables
我正在 运行 以下查询无法正常工作:
create table #temp(
tableName nvarchar(50)
)
insert into #temp
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
DECLARE @name VARCHAR(50)
DECLARE @TQ VARCHAR(500)
DECLARE @ContainName VARCHAR(500)
DECLARE db_cursor CURSOR FOR
SELECT tableName
FROM #temp
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
select @name IF COL_LENGTH(@name,'IsDeleted') IS NOT NULL
begin
IF COL_LENGTH(@name,'IsActive') IS NOT NULL
begin
exec ('UPDATE '+@name+' SET [IsActive] = ~[IsDeleted]')
end
ELSE
BEGIN
exec('ALTER TABLE '+@name+' ADD IsActive bit')
exec ('UPDATE '+@name+' SET [IsActive] = ~[IsDeleted]')
exec('ALTER TABLE '+@name+' ALTER COLUMN IsActive SET DEFAULT ''true''')
END
if exists(select * from sysobjects o inner join syscolumns c on o.id = c.cdefault inner join sysobjects t on c.id = t.id where o.xtype = 'D' and c.name = 'IsDeleted' and t.name = @name)
begin
set @ContainName=(select o.name from sysobjects o inner join syscolumns c on o.id = c.cdefault inner join sysobjects t on c.id = t.id where o.xtype = 'D' and c.name = 'IsDeleted' and t.name = @name)
exec('ALTER TABLE ' + @name + ' drop constraint ' + @ContainName)
end
exec('ALTER TABLE '+@name+' DROP COLUMN [IsDeleted]')
end
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
drop table #temp
在我的数据库中的大多数 table 中,有两列 "IsActive" 和 "IsDeleted",它们都有默认键约束并且类型为 BIT
我正在尝试执行以下操作:
如果列 IsDeleted 存在,则将其 IsDeleted 的负值复制到 IsActive。
如果IsDeleted列存在但IsActive不存在,则创建IsActive列,将IsDeleted的负值复制到IsActive,然后将默认键约束添加到IsDeleted列。
3.Finally 从 IsDeleted 列中删除默认值约束,然后删除该列。
我在 运行 上面查询数据库中的每个 table。
上面的查询 运行 很好,并根据需要更新每个 table,但它也给我错误 'incorrect syntax near SET'
我用 4 table 创建了测试数据库。第一个 table 包含 2 列:IsActive 和 IsDeleted,第二个 Table 仅包含列 IsActive,第三个 table 仅包含列 IsDeleted,第四个 table 包含一个普通的 nvarchar 列。上面执行的时候。一切正常,但在 SET 附近出现错误 Incorrect Syntax。实际上我得到了想要的结果,但也收到了不需要的错误消息。
这对我有用:
DECLARE @name VARCHAR(50)
DECLARE @TQ VARCHAR(500)
DECLARE @ContainName VARCHAR(500)
DECLARE db_cursor CURSOR
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
IF COL_LENGTH(@name, 'IsDeleted') IS NOT NULL
BEGIN
IF COL_LENGTH(@name, 'IsActive') IS NOT NULL
BEGIN
EXEC ('UPDATE '+@name+' SET [IsActive] = 1 - [IsDeleted]')
END
ELSE
BEGIN
EXEC('ALTER TABLE '+@name+' ADD IsActive bit')
EXEC ('UPDATE '+@name+' SET [IsActive] = 1 - [IsDeleted]')
EXEC('ALTER TABLE '+@name+' ADD CONSTRAINT DF_'+@name+' DEFAULT(0) for [IsActive]')
END
IF EXISTS ( SELECT *
FROM sysobjects o
INNER JOIN syscolumns c ON o.id = c.cdefault
INNER JOIN sysobjects t ON c.id = t.id
WHERE o.xtype = 'D'
AND c.name = 'IsDeleted'
AND t.name = @name )
BEGIN
SET @ContainName = ( SELECT o.name
FROM sysobjects o
INNER JOIN syscolumns c ON o.id = c.cdefault
INNER JOIN sysobjects t ON c.id = t.id
WHERE o.xtype = 'D'
AND c.name = 'IsDeleted'
AND t.name = @name
)
EXEC('ALTER TABLE ' + @name + ' drop constraint ' + @ContainName)
END
EXEC('ALTER TABLE '+@name+' DROP COLUMN [IsDeleted]')
END
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
我正在 运行 以下查询无法正常工作:
create table #temp(
tableName nvarchar(50)
)
insert into #temp
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
DECLARE @name VARCHAR(50)
DECLARE @TQ VARCHAR(500)
DECLARE @ContainName VARCHAR(500)
DECLARE db_cursor CURSOR FOR
SELECT tableName
FROM #temp
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
select @name IF COL_LENGTH(@name,'IsDeleted') IS NOT NULL
begin
IF COL_LENGTH(@name,'IsActive') IS NOT NULL
begin
exec ('UPDATE '+@name+' SET [IsActive] = ~[IsDeleted]')
end
ELSE
BEGIN
exec('ALTER TABLE '+@name+' ADD IsActive bit')
exec ('UPDATE '+@name+' SET [IsActive] = ~[IsDeleted]')
exec('ALTER TABLE '+@name+' ALTER COLUMN IsActive SET DEFAULT ''true''')
END
if exists(select * from sysobjects o inner join syscolumns c on o.id = c.cdefault inner join sysobjects t on c.id = t.id where o.xtype = 'D' and c.name = 'IsDeleted' and t.name = @name)
begin
set @ContainName=(select o.name from sysobjects o inner join syscolumns c on o.id = c.cdefault inner join sysobjects t on c.id = t.id where o.xtype = 'D' and c.name = 'IsDeleted' and t.name = @name)
exec('ALTER TABLE ' + @name + ' drop constraint ' + @ContainName)
end
exec('ALTER TABLE '+@name+' DROP COLUMN [IsDeleted]')
end
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
drop table #temp
在我的数据库中的大多数 table 中,有两列 "IsActive" 和 "IsDeleted",它们都有默认键约束并且类型为 BIT 我正在尝试执行以下操作:
如果列 IsDeleted 存在,则将其 IsDeleted 的负值复制到 IsActive。
如果IsDeleted列存在但IsActive不存在,则创建IsActive列,将IsDeleted的负值复制到IsActive,然后将默认键约束添加到IsDeleted列。
3.Finally 从 IsDeleted 列中删除默认值约束,然后删除该列。
我在 运行 上面查询数据库中的每个 table。 上面的查询 运行 很好,并根据需要更新每个 table,但它也给我错误 'incorrect syntax near SET'
我用 4 table 创建了测试数据库。第一个 table 包含 2 列:IsActive 和 IsDeleted,第二个 Table 仅包含列 IsActive,第三个 table 仅包含列 IsDeleted,第四个 table 包含一个普通的 nvarchar 列。上面执行的时候。一切正常,但在 SET 附近出现错误 Incorrect Syntax。实际上我得到了想要的结果,但也收到了不需要的错误消息。
这对我有用:
DECLARE @name VARCHAR(50)
DECLARE @TQ VARCHAR(500)
DECLARE @ContainName VARCHAR(500)
DECLARE db_cursor CURSOR
FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
IF COL_LENGTH(@name, 'IsDeleted') IS NOT NULL
BEGIN
IF COL_LENGTH(@name, 'IsActive') IS NOT NULL
BEGIN
EXEC ('UPDATE '+@name+' SET [IsActive] = 1 - [IsDeleted]')
END
ELSE
BEGIN
EXEC('ALTER TABLE '+@name+' ADD IsActive bit')
EXEC ('UPDATE '+@name+' SET [IsActive] = 1 - [IsDeleted]')
EXEC('ALTER TABLE '+@name+' ADD CONSTRAINT DF_'+@name+' DEFAULT(0) for [IsActive]')
END
IF EXISTS ( SELECT *
FROM sysobjects o
INNER JOIN syscolumns c ON o.id = c.cdefault
INNER JOIN sysobjects t ON c.id = t.id
WHERE o.xtype = 'D'
AND c.name = 'IsDeleted'
AND t.name = @name )
BEGIN
SET @ContainName = ( SELECT o.name
FROM sysobjects o
INNER JOIN syscolumns c ON o.id = c.cdefault
INNER JOIN sysobjects t ON c.id = t.id
WHERE o.xtype = 'D'
AND c.name = 'IsDeleted'
AND t.name = @name
)
EXEC('ALTER TABLE ' + @name + ' drop constraint ' + @ContainName)
END
EXEC('ALTER TABLE '+@name+' DROP COLUMN [IsDeleted]')
END
FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor