Я занимался кодированием хранимой процедуры, которая содержит две временные таблицы и курсор. Прошло два дня с тех пор, как я получил это задание, и мне тяжело, потому что я впервые занимаюсь кодированием SP такой сложности.Неправильное размещение SELECT в курсоре вызывает появление большого количества таблиц
Курсор должен выводить данные из DATABASE_X и позволяет получать данные для сравнения с DATABASE_Y.
TableInfo стол в DATABASE_Y должен содержать все, или большинство из схем и таблиц, которые DATABASE_X. Аналогичная ситуация наблюдается и для таблицы ColumnInfo, с отличием от таблицы таблицы TableInfo, которая также может содержать данные столбца.
Временные таблицы, которые, соответственно, содержат данные о несуществующих таблицах в DATABASE_Y.TableInfo и несуществующих столбцов в DATABASE_Y.ColumnInfo предназначены для заполнения после сравнения. (Несуществующие означает, что таблица А существует в DBX, но не в строках DBY.TableInfo, и наоборот для случая столбцов)
NotInUse столбец, который существует в DATABASE_Y.TableInfo является определяющим фактором для следует ли рассматривать таблицу в DBX для рассмотрения.
CREATE TABLE #NONEXISTENT_TABLES(
SCHEMA_NAME VARCHAR(100),
TABLE_NAME VARCHAR(100)
)
CREATE TABLE #NONEXISTENT_COLUMNS(
SCHEMA_NAME VARCHAR(100),
TABLE_NAME VARCHAR(100),
COLUMN_NAME VARCHAR(100)
)
DECLARE @SchemaName VARCHAR(100)
DECLARE @TableName VARCHAR(100)
DECLARE @ColumnName VARCHAR(100)
USE DATABASE_X;
DECLARE CRS_GET_NONEXISTENT_STUFF CURSOR FOR
select s.name as 'sname', t.name as 'tname', c.name as 'cname'
from sys.schemas (nolock) s
join sys.tables (nolock) t
on s.schema_id = t.schema_id
join sys.columns (nolock) c
on c.object_id = t.object_id
order by 1,2,3
OPEN CRS_GET_NONEXISTENT_STUFF
FETCH NEXT FROM CRS_GET_NONEXISTENT_STUFF INTO @SchemaName,
@TableName,
@ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
select @SchemaName, @TableName
from DATABASE_Y..TableInfo (nolock) ti
print @SchemaName + '-' + @TableName
IF @@ROWCOUNT = 1
BEGIN
declare @NotInUse varchar(100)
select @NotInUse = ti.[NotInUse]
from DATABASE_Y..TableInfo (nolock) ti
where ti.[Schema] = @SchemaName
and ti.[Name] = @TableName
print @SchemaName + '-' + @TableName
IF @NotInUse = '0'
DECLARE @colname varchar(100)
BEGIN
select @colname = ci.[Name]
from DATABASE_Y..ColumnInfo (nolock) ci
where ci.[TableSchema] = @SchemaName
and ci.[TableName] = @TableName
and ci.[Name] = @ColumnName
print @SchemaName + '-' + @TableName + '-' + @ColumnName
IF @colname IS NULL
BEGIN
INSERT INTO #NONEXISTENT_COLUMNS(SEMA_ADI, TABLO_ADI, KOLON_ADI)
VALUES(@SchemaName, @TableName, @colname)
END
END
END
ELSE
INSERT INTO #NONEXISTENT_TABLES(SCHEMA_NAME, TABLE_NAME)
VALUES (@SchemaName, @TableName)
FETCH NEXT FROM CRS_GET_NONEXISTENT_STUFF INTO @SchemaName,
@TableName,
@ColumnName
END
CLOSE CRS_GET_NONEXISTENT_STUFF
DEALLOCATE CRS_GET_NONEXISTENT_STUFF
SELECT * FROM #NONEXISTENT_COLUMNS
SELECT * FROM #NONEXISTENT_TABLES
DROP TABLE #NONEXISTENT_COLUMNS
DROP TABLE #NONEXISTENT_TABLES
Предполагая, что: * Первая схема на DBX ААА и первый стол на DBX ААА является BBBBB * Вторая таблица ААА является CCCCC;
Я получаю бесчисленное количество таблиц в результате запроса с чуть-чуть-чуть-похожим на бытие-конец, имеющего только AAA-BBBBB, отображаемый в 5-6 таблицах с примерно 5000 строк, а затем переход на AAA-CCCCC делает то, что произошло выше, и оно продолжается и продолжается.
Я считаю, что моя ошибка была поставить выбора команд в соответствии с этим время цикла, но я также считаю, что это была не моя единственная ошибка ...
Я ценю имея советы всех вас об этом проблема.
Прошу прощения за простую стену текста.
ошибка в скрипте выше заставляет меня получить бесконечное количество таблиц, и я должен решить эту проблему ... это в основном вопрос , Мне нужно получить только две финальные таблицы, которые являются таблицами несуществующих столбцов и несуществующих таблиц. –
Ну удалите/прокомментируйте достаточно кода, чтобы понять, почему он застрял, и как только вы знаете, что его вызывает, исправьте его. –
Мне казалось, что я должен опубликовать весь код, потому что я не знаком с синтаксисом ... Я не уверен, есть ли у меня несколько ошибок или нет. –