Хобрук: Ваш путь к мастерству в программировании

Использование динамического sql для заполнения временной таблицы

Я знаю, что это не идеально, но я хотел бы знать, возможно ли заполнить временную таблицу на основе динамического sql?

Очень похожий пример того, чего я хочу достичь, показан в этом ответе как либо

SELECT into #T1 execute ('execute ' + @SQLString )

or

INSERT into #T1 execute ('execute ' + @SQLString )

Я не мог заставить ни работать. Судя по редактированию, первый вариант был неправильным, поэтому для второго варианта я попробовал что-то вроде;

DECLARE @SQLString VARCHAR (2000) = 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS'

INSERT into #MyTempTable execute (@SQLString )

Любые идеи высоко ценятся.

Изменить:

В попытке прояснить, что я пытаюсь сделать, не слишком локализуя себя, я объясню ниже как можно короче.

У меня есть данные в промежуточной области моей базы данных, которая содержит таблицы с динамическими именами и динамическим количеством столбцов. Однако некоторые имена столбцов одинаковы для каждой таблицы. Вместо того, чтобы создавать все в динамическом sql, я хотел бы иметь возможность просто извлекать известные столбцы во временную таблицу (или табличную переменную, CTE, производную таблицу или что-то еще) и действовать в соответствии с этим.

Итак, таблица как таковая;

  CREATE TABLE SomeParticularNameThatCantBeKnownToAStoredProc (
      [1] AS VARCHAR(100),
      [2] AS VARCHAR(100),
      ... -- Could be any number of these columns
      [Id] AS INT,
      [KnownCol] AS VARCHAR(100),
      [KnownCol2] AS VARCHAR(100),
      ....
      [DboId] AS INT
  )

Я хотел бы иметь возможность выполнять необходимые операции, чтобы позволить мне обрабатывать эти данные без необходимости делать все это в динамическом sql. Я надеялся, что смогу сделать что-то вроде;

  DECLARE @TableName AS VARCHAR(1000) = 'SomeParticularNameThatCantBeKnownToAStoredProc'

  SELECT [Id], [KnownCol], [KnownCol2], [DboId] 
  INTO #KnownName
  FROM @TableName -- I know this isn't possible, but this is what I'd like to do

Затем это позволило бы мне выполнять операторы SQL для согласованного #KnownName. Некоторые из других операций, которые мне нужно выполнить, довольно длительны, например, использование данных для связи с другими существующими таблицами, копирование данных из промежуточных таблиц в их эквиваленты схемы dbo и сопоставление DboId с идентификатором промежуточной таблицы с использованием MERGE с ВЫВОД В, как описано здесь и так далее и тому подобное.

Если вы можете придумать какой-либо другой способ ограничить объем динамического SQL, который мне нужно написать, учитывая тот факт, что имя таблицы является динамическим, пожалуйста, дайте мне знать.


  • Обычно полезно объяснить, что не может получиться работать значит. Вы получили ошибку? Что это было? 07.08.2012
  • Прости. Если вы скопируете очень простой фрагмент в конце моего поста и выполните его, вы должны получить недопустимое имя объекта «#MyTempTable». 07.08.2012

Ответы:


1

Предполагая, что #MyTempTable уже существует:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM INFORMATION_SCHEMA.COLUMNS;';
INSERT #MyTempTable EXEC sp_executesql @SQLString;

В противном случае, пожалуйста, уточните, что вы пытаетесь сделать. Если таблица еще не создана, вы можете делать все внутри динамического SQL, например:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * INTO #MyTempTable FROM INFORMATION_SCHEMA.COLUMNS;
  SELECT * FROM #MyTempTable;';
EXEC sp_executesql @sql;
07.08.2012
  • После того, как я изменил SQLString на @sql из вашего примера выше, я получаю ту же ошибку, что и в моем примере выше: Недопустимое имя объекта '#MyTempTable'. 07.08.2012
  • Я только что перечитал ваш пост о предположении, что #MyTempTable уже существует. Тогда скорее всего это моя проблема. Знаете ли вы, как я могу определить структуру временной таблицы, а также заполнить ее с помощью динамического sql. Это, скорее всего, причина моих проблем. У меня сложилось впечатление, что, как и в этом ответе, структура временной таблицы была определена в результате выполнения запроса бегать. 07.08.2012
  • Опять же, может помочь уточнение того, что вы на самом деле пытаетесь сделать. Зачем здесь нужна таблица #temp? Что еще вы делаете с ним после того, как он был заселен? 07.08.2012
  • Еще раз спасибо за быстрый ответ. Я не хотел запутывать вопрос длинной историей. Однако цель получения данных во временной таблице позволит мне свести к минимуму объем динамического sql, который мне нужно написать. Динамический sql извлекает данные из промежуточной области базы данных, которые происходят из плоских файлов. Имена промежуточных таблиц являются динамическими, и каждая таблица имеет разное количество столбцов (отсюда и динамический sql). С помощью проверки пользователя и сопоставления столбцов мы стремимся копировать данные в таблицы в разделе схемы dbo базы данных. Кстати, я не смог заставить ваш последний пример работать. Та же ошибка 07.08.2012
  • Поиграв с вашим примером, я могу заставить его работать, удалив INSERT #MyTempTable из последней строки. Однако это означает, что таблица Temp доступна только из динамического sql, что на самом деле не то, что мне нужно. Я хотел бы не ссылаться на имя моей динамической таблицы, поскольку единственный известный мне способ сделать это - через динамический sql. 07.08.2012
  • Можете ли вы показать полный пример того, что вы в идеале хотели бы сделать, пожалуйста, используя псевдокод там, где вам нужно, чтобы я мог лучше понять основную цель? (Пожалуйста, обновите вопрос, не размещайте код в комментарии.) 07.08.2012
  • Я очень ценю вашу помощь, но я думаю, что это будет слишком локализовано. Думаю, я понял, что то, что я пытаюсь сделать, на самом деле невозможно без глобальных временных таблиц или другого подхода. Я, вероятно, пока оставлю его там и, скорее всего, даже удалю весь этот вопрос, поскольку он имеет ограниченное применение для сообщества SO. Я оставлю его открытым на день или около того, вы можете получить этот комментарий, но после этого удалите его. Еще раз спасибо. 07.08.2012
  • Я не знаю, нужно ли его удалять, и я не думаю, что ##global temp table будет ответом (если только параллелизм действительно не требуется). Я думаю, вы должны попробовать свой сценарий — только потому, что никто другой не делает в точности то, что делаете вы, не означает потенциального решения для других, которые могут делать что-то подобное. 07.08.2012
  • Я отредактировал вопрос, чтобы предоставить дополнительную информацию в надежде, что у кого-то могут быть другие решения. Еще раз спасибо. 08.08.2012
  • Новые материалы

    Почему я, журналист, в отчаянии создал сетевое приложение B2B
    Почему я, журналист, в отчаянии создал сетевое приложение B2B Итак, вот верхняя линия. Я построил OnGreentech, сеть для индустрии возобновляемых источников энергии. Если вам интересно,..

    Ограниченные машины Больцмана (RBM)
    Практическое руководство по обучению RBM.pdf Задний план RBM использовались в качестве генеративных моделей для многих различных типов данных, включая помеченные и немеченые. В их условной..

    Обнаружение маски или без маски с YOLO😷
    Это руководство по созданию пользовательской модели обнаружения объектов для обнаружения людей, носящих или не носящих маски в общественных местах, созданной с использованием YOLO v3. Модель..

    Управление приборами в чистом PHP
    Этот пост дополняет эти: E2e тестирование Работа с несколькими средами . Мы разработали это решение для базы данных MariaDB, оно может отличаться, если вы используете другую базу..

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..