Как вставить переменные с помощью выбора с несколькими условиями SQL Server - PullRequest
1 голос
/ 11 февраля 2011

Как вставить переменные с выбором с несколькими условиями, предположим, что функция возвращает временную таблицу, и я хочу заполнить другую таблицу, но какой запрос сделать что-то вроде

INSERT INTO @table (La, Lb, Qaa, Qab,Qbb) 
   SELECT items 
   FROM dbo.SOME_FUNCTION() 
   WHERE Condition for La 
     AND condition for Lb 
     AND condition for Qaa 
     AND condition for Qab 
     AND condition for Qbb...

Ну, код, который я делаю с одним ответом, выглядит так:

Declare @table TABLE
(
    La   varchar(80),
    Lb   varchar(80),
    Qaa  varchar(80),
    Qab  varchar(80),
    Qbb  varchar(80)
)

INSERT INTO @table (La, Lb, Qaa, Qab,Qbb)
    SELECT  a.La,
            a.Lb,
            a.Qaa,
            a.Qab,
            a.Qbb
    FROM   dbo.function(@somevar) a 
    WHERE   a.itemindex =  1
    AND     a.itemindex =  3 
    AND     a.itemindex =  5 
    AND     a.itemindex =  7 
    AND     a.itemindex =  9 

Но я получаю ошибку,

Извините, я исправил это, но все еще получаю ошибку

Msg 207, Level 16, State 1, Procedure NLQ_1, Line 189
Invalid column name 'La'.

Почему это неправильно, все имена столбцов La, Lb, Qaa, ...

Ответы [ 3 ]

1 голос
/ 11 февраля 2011

При объявлении таблицы просто не используйте ключевые слова "as":

DECLARE @table TABLE
(
    La   varchar(80),
    Lb   varchar(80),
    Qaa  varchar(80),
    Qab  varchar(80),
    Qbb  varchar(80)
)

Это все, что не так с вашим кодом ...

1 голос
/ 11 февраля 2011

Во-первых, я думаю, что сообщение об ошибке касается La, который выбирается из функции (a.La), а не о La, который вставляется в.

Во-вторых, есть проблема с фильтром WHERE:

WHERE   a.itemindex =  1
AND     a.itemindex =  3 
AND     a.itemindex =  5 
AND     a.itemindex =  7 
AND     a.itemindex =  9 

Это интерпретируется следующим образом: «[выберите строки], где a.itemindex равно 1 и одновременно равно 3, а также 5 и т. Д.» Вы бы по праву думали, что это никогда не может быть правдой.

Вы, вероятно, думали об условии, которое применяется ко всем строкам в целом : «достаньте мне эти строки и эти и эти ...». Скорее, вы должны думать об этом условии применительно к каждой отдельной строке . Обратите внимание: «выберите каждую строку, где a.itemindex равно 1 или , равно 3 или до 5 и т. Д.». Таким образом, вы получите правильное условие фильтра, а именно:

WHERE   a.itemindex =  1
OR      a.itemindex =  3 
OR      a.itemindex =  5 
OR      a.itemindex =  7 
OR      a.itemindex =  9 

Но вы можете упростить это еще больше. Как вам это нравится: «где a.itemindex - это одно из следующих значений: 1, 3, 5, 7, 9»? И в SQL для этого тоже есть логическая операция, она называется IN («В этом списке:»). И вот что вы в итоге получите:

WHERE   a.itemindex IN (1, 3, 5, 7, 9)

Чудесно, не правда ли?

0 голосов
/ 11 февраля 2011

Хорошо, если я вас правильно понимаю, вам нужно попробовать что-то вроде

INSERT INTO @table (col1, col2, col3, col4, col5)
SELECT  a.col1,
        a.col2,
        a.col3,
        a.col4,
        a.col5
FROM    dbo.Your_Function() a
WHERE   a.colx = condition1
AND     a.coly = condition2
AND     a.colz = condition3

Логика WHERE будет использоваться против результатов функции, и вам нужно указать столбцы, в которые вы хотите вставитьи с.

РЕДАКТИРОВАТЬ:

Объявить таблицу переменных как

Declare @table TABLE (     
    La    varchar(80),     
    Lb    varchar(80),     
    Qaa   varchar(80),     
    Qab   varchar(80),     
    Qbb   varchar(80) 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...