Дано:
- @ Records содержит список целочисленных идентификаторов
- # Столбцы содержит информацию из INFORMATION_SCHEMA.COLUMNS для получения дополнительной информации.чем одна таблица (и некоторые другие вещи)
Я пытаюсь перебрать @Records и переместить значения столбцов в резервную таблицу.Например:
DECLARE @KeyId
SET @KeyId = 1
DECLARE @Records (id int)
INSERT INTO @Records VALUES (1),(2),(3)
DECLARE #Columns (ColName varchar(100),ColType varchar(100),DataTable varchar(100),DataSchema(100))
INSERT INTO #Columns (ColName,ColType,DataTable,DataSchema) VALUES
('Column1','int','Table1','dbo.'),
('Column2','varchar(50)','Table1','dbo.'),
('Column3','varchar(10)','Table2','dbo.'),
('Column3','int','Table2','dbo.')
CREATE TABLE Table1 (id int, Column1 int, Column2 varchar(50))
CREATE TABLE Table2 (id int, Column3 varchar(10), Column4 int)
INSERT INTO Table1 VALUES (1,1,'test1'),(2,2,'test2')
INSERT INTO Table2 VALUES (1,'test3',3),(2,'test4',4)
Должен поворачиваться с
Table1 Table2
id|Column1|Column2 id|Column3|Column4
__________________ __________________
1 |1 |'test1' 1 |'test3'|3
2 |2 |'test2' 2 |'test4'|4
на
KeyId|ColName |ColValue|DataTable|DataSchema
_______________________________________________
1|'Column1'|'1' |'Table1' |'dbo.'|
1|'Column2'|'test1' |'Table1' |'dbo.'|
1|'Column3'|'test3' |'Table2' |'dbo.'|
1|'Column4'|'3' |'Table2' |'dbo.'|
2|'Column1'|'2' |'Table1' |'dbo.'|
2|'Column2'|'test2' |'Table1' |'dbo.'|
2|'Column3'|'test4' |'Table2' |'dbo.'|
2|'Column4'|'4' |'Table2' |'dbo.'|
DECLARE @r int
WHILE EXISTS(SELECT TOP 1 * FROM @Records)
BEGIN
SET @r = (SELECT TOP 1 * FROM @Records)
SELECT @KeyId,col.ColName,colValue,col.ColType,col.DataTable,col.DataSchema
FROM #Columns col
CROSS APPLY(
EXEC ('SELECT '+col.ColName+' FROM '+col.DataSchema+col.DataTable+' WHERE '+'Id'+' = '+@r)
) x(colValue)
DELETE TOP(1) FROM @Records
@KeyId += 1
END
К сожалению, EXEC [...] «Заявление, по-видимому, недопустимо в этом контексте (что я считаю разумным).Однако, что-то вроде
CROSS APPLY(
SELECT '1'
)
дает
KeyId|ColName |ColValue|DataTable|DataSchema
_______________________________________________
1|'Column1'|'1' |'Table1' |'dbo.'|
1|'Column2'|'1' |'Table1' |'dbo.'|
1|'Column3'|'1' |'Table2' |'dbo.'|
1|'Column4'|'1' |'Table2' |'dbo.'|
2|'Column1'|'1' |'Table1' |'dbo.'|
2|'Column2'|'1' |'Table1' |'dbo.'|
2|'Column3'|'1' |'Table2' |'dbo.'|
2|'Column4'|'1' |'Table2' |'dbo.'|
Форматирует именно так, как я хотел бы, за исключением «1» вместо нужного мне значения.
IsЕсть какой-то подход, который я могу использовать, чтобы сделать то же самое:
For each @Record
For each col.DataTable
For each col.ColName
get the Column value
или способ выполнить динамическое выделение в этом месте?