Буферизация результатов из курсора в таблицу

У меня есть курсор, который я использую для поиска столбцов NULL в базе данных. Я использую это, чтобы исключить столбцы 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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте печать выбранной, а затем вставьте в (таблица с тем же определением столбца). Создайте таблицу с теми же столбцами в том же порядке. Затем поместите Insert в вашу таблицу (ваши столбцы в том же порядке, что и вывод из exec(). Любое изменение в столбцах таблицы в будущем может нарушить это. Таблица и запрос должны иметь одинаковые столбцы. Если вы осторожны и контролируете порядок столбцов при выборе и вставке, порядок столбцов в таблице не должен иметь значения, но имхо это все же хорошая практика.

Пример (вставить в таблицу с динамическим 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;

Другие вопросы по теме