можно вставить 1-ю из n таблиц из прок в временную таблицу? - PullRequest
1 голос
/ 24 июня 2009

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

У меня есть процесс, который возвращает 3 таблицы. Таблица1 имеет 23 столбца. Таблица2 имеет 12 столбцов. Таблица3 имеет 2 столбца. Мне нужно запустить этот процесс и сбросить результаты таблицы 1 во временную таблицу. Я создал @table, а затем сделал это:

insert @myTable 
exec [myDb].dbo.[multitableProc] 'A', 'B', 'C', 100 

Но когда я делаю это, ошибка:

Ошибка вставки: имя столбца или номер предоставленные значения не соответствуют таблице определение.

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

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

1 Ответ

2 голосов
/ 24 июня 2009

Единственный способ сделать это - использовать хранимую процедуру CLR . Пусть sproc CLR вызовет sproc, который возвращает три таблицы. Затем возьмите только ту таблицу, которую вы хотите, и верните ее из своего модуля CLR. Вставьте результаты вашего CLR sproc в ваш @myTable. Я думаю, что это даст вам дополнительный уровень косвенности, необходимый для устранения несоответствия столбцов из двух других наборов результатов.

Хорошо, я создал сильно упрощенную версию для тестирования. Я возвратил два набора результатов из таблицы, один с одним столбцом и один с двумя ...

DECLARE @myTable TABLE ( col1 varchar(50) )

INSERT @myTable( col1 )
EXEC TestTable

Получает правильный результат ...

Сообщение 213, Уровень 16, Состояние 7, Процедура TestTable, строка 23 Имя столбца или количество введенных значений не определение таблицы соответствий.

Я создал этот ответный запрос CLR, который берет только первый набор результатов (набор с одним столбцом) из моего тестового набора TSQL и возвращает только эту таблицу ...

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void FilterResult()
    {
        using (var conn = new SqlConnection("context connection = true"))
        {
            var retVal = new SqlDataRecord( new SqlMetaData("col1",
                                            SqlDbType.NVarChar, 50));
            conn.Open();

            var cmd = new SqlCommand("exec TestTable", conn);

            SqlContext.Pipe.SendResultsStart(retVal);

            using (var dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    var tmpCol = dr.GetString(0);
                    retVal.SetString(0, tmpCol);

                    SqlContext.Pipe.SendResultsRow(retVal);
                }

                dr.Close();
            }

            SqlContext.Pipe.SendResultsEnd();
        }
    }
};

Тогда я могу выполнить ...

INSERT @myTable( col1 )
EXEC TestFilter  -- note the CLR sproc here instead of the TSQL sproc

... и все счастливы ...

(затронуто 2 строк)

В конце концов, это может быть больше проблем, чем стоит, но это работает как доказательство концепции. (Нет гарантии относительно производительности.)

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