SQL Server ВЫБРАТЬ В @ переменную? - PullRequest
222 голосов
/ 28 января 2011

У меня есть следующий код в одном из моих сохраненных процессов Sql (2008), который прекрасно работает:

    CREATE PROCEDURE [dbo].[Item_AddItem]
        @CustomerId uniqueidentifier,
        @Description nvarchar(100),
        @Type int,
        @Username nvarchar(100),
    AS
    BEGIN

        DECLARE @TopRelatedItemId uniqueidentifier;
        SET @TopRelatedItemId = 
        (
           SELECT top(1) RelatedItemId 
           FROM RelatedItems 
           WHERE CustomerId = @CustomerId
        ) 

        DECLARE @TempItem TABLE
        (
            ItemId uniqueidentifier,
            CustomerId uniqueidentifier,
            Description nvarchar(100),
            Type int,
            Username nvarchar(100),
            TimeStamp datetime
        );

        INSERT INTO Item
        OUTPUT INSERTED.* INTO @TempItem
        SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()

        SELECT
            ItemId,
            CustomerId,
            @TopRelatedItemId,
            Description,
            Type,
            Username,
            TimeStamp
        FROM
            @TempItem
END
GO

Итак, вопрос для вас, ребята, есть ли возможность что-то сделать вместестроки:

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Чтобы я мог повторно использовать эти данные из памяти в других следующих утверждениях?SQL Server подгоняет вышеприведенный оператор, однако я не хочу создавать отдельные переменные и инициализировать каждую из них с помощью отдельного оператора SELECT для одной и той же таблицы .... UGH !!!

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

Ответы [ 7 ]

460 голосов
/ 30 августа 2011

Если вы хотите просто назначить некоторые переменные для последующего использования, вы можете сделать их одним выстрелом с чем-то вроде этого:

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

Если это то, что вам нужно после

191 голосов
/ 28 января 2011

Вы НЕ МОЖЕТЕ ВЫБРАТЬ. Лучшее, что вы можете сделать, это сначала создать его, а затем вставить в него. Ваш второй фрагмент должен быть

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId
30 голосов
/ 30 января 2011

вы можете сделать это:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

, затем позже

SELECT CustomerId FROM #tempCustomer

вам не нужно объявлять структуру # tempCustomer

14 голосов
/ 28 января 2011

Похоже, ваш синтаксис немного отсутствует.Вот несколько хороших примеров

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Затем позже

SELECT CustomerId FROM @TempCustomer
2 голосов
/ 28 января 2011

Звучит так, как будто вы хотите временные таблицы. http://www.sqlteam.com/article/temporary-tables

Обратите внимание, что #TempTable доступен для всего вашего SP.

Обратите внимание, что ## TempTable доступен для всех.

1 голос
/ 22 марта 2019

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

Пока что я делаю, объединяю всеКод SQL с переменными для использования.Вот так:

declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name

EXEC('
        SELECT var1, var2, var3
        INTO '+@table_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

Надеюсь, это поможет, но это может быть громоздко, если код слишком большой, поэтому, если вы нашли лучший способ, пожалуйста, поделитесь!

0 голосов
/ 08 января 2015
"SELECT *
  INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId"

Это означает создание новой переменной таблицы @tempCustomer и вставку данных ОТ клиента.Вы уже заявили об этом выше, так что нет необходимости снова объявлять.Лучше пойти с

INSERT INTO @tempCustomer SELECT * FROM Customer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...