Результаты буферизации из курсора в таблицу - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть курсор, который я использую, чтобы найти пустые столбцы в базе данных.Я использую это, чтобы исключить NULL-столбцы при загрузке этих данных в Salesforce с использованием dbAMP.Я хотел бы изменить это, чтобы поместить результаты в таблицу и включить имя таблицы и имя столбца.

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

Мне не удалось изменить этот курсор, чтобы поместить результаты в таблицу.Любое руководство будет оценено.

1 Ответ

1 голос
/ 09 апреля 2019

Сделайте Печать a Выбрать, затем Вставьте в (таблица с таким же определением столбца).Создайте таблицу с одинаковыми столбцами в том же порядке.Затем поместите вставку в вашу таблицу (ваши столбцы в том же порядке, что и выходные данные exec (). Любое изменение в столбцах таблицы в будущем может нарушить это. Таблица и запрос должны иметь одинаковые столбцы. Если вы осторожны и контролируетепорядок столбцов в операциях выбора и вставки, это не должно иметь значения для порядка столбцов таблицы, но это хорошая практика 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;
...