我有一个游标,我用来在数据库中找到NULL列。我正在使用它来消除使用dbAMP将此数据上传到Salesforce的NULL列。我想修改它以将结果假脱机到表中,并包括表名和列名。
declare @col varchar(255), @cmd varchar(max)
DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID =
c.Object_ID
WHERE t.Name = 'Account'
OPEN getinfo
FETCH NEXT FROM getinfo into @col
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM Account WHERE [' + @col +
'] IS NOT NULL) BEGIN print ''' + @col + ''' end'
EXEC(@cmd)
FETCH NEXT FROM getinfo into @col
END
CLOSE getinfo
DEALLOCATE getinfo
我没有成功修改此游标以将结果放入表中。任何指导将不胜感激。
使打印成为选择然后插入(具有相同列定义的tbl)。以相同的顺序创建具有相同列的表。然后将一个Insert放入yourtable(您的列的顺序与exec()的输出顺序相同。将来表格列中的任何更改都可能会破坏这一点。表格和查询应该具有相同的列。如果您谨慎并且控制在select和insert中列的顺序,关于表列顺序应该没关系,但它仍然是不错的做法imho。
示例(使用动态sql插入表)
if object_id('dbo.ColumnMatch','U') is not null drop table dbo.ColumnMatch;
create table dbo.ColumnMatch (
id int identity(1,1) not null primary key
,column_name varchar(512)
);
declare @col varchar(256) = 'This Column Name'
declare @s varchar(max) = 'select ''' + @col + '''';
insert into ColumnMatch (column_name)
exec(@s);
select * from ColumnMatch;
不打印,但选择并修复Insert Into语句。 :)
if object_id('dbo.ColumnMatch','U') is not null drop table dbo.ColumnMatch;
create table dbo.ColumnMatch (
id int identity(1,1) not null primary key
,column_name varchar(512)
);
declare @col varchar(255), @cmd varchar(max)
DECLARE getinfo cursor for
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID =
c.Object_ID
WHERE t.Name = 'Account'
OPEN getinfo
FETCH NEXT FROM getinfo into @col
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM Account WHERE [' + @col +
'] IS NOT NULL) BEGIN select ''' + @col + ''' column_name end'
Insert into ColumnMatch (column_name)
EXEC(@cmd)
FETCH NEXT FROM getinfo into @col
END
CLOSE getinfo
DEALLOCATE getinfo
select * from ColumnMatch;