Выполнение динамического запроса внутри оператора CROSS APPLY? - PullRequest
0 голосов
/ 12 июня 2018

Дано:

  • @ 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

или способ выполнить динамическое выделение в этом месте?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...