SQL Server SELECT INTO @variable?
У меня есть следующий код в одном из моих Sql (2008) Stored Procs, который отлично исполняет:
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!!!
Любые предложения о том, как добиться чего-то по строкам без нескольких запросов к одной таблице?
Ответы
Ответ 1
Вы не можете выбрать... INTO.. ТАБЛИЦУ ПЕРЕМЕННОГО. Лучшее, что вы можете сделать, это создать его сначала, а затем вставить в него. Ваш второй фрагмент должен быть
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
Ответ 2
Если вы хотите просто назначить некоторые переменные для последующего использования, вы можете сделать их одним выстрелом с чем-то в этих строках:
declare @var1 int,@var2 int,@var3 int;
select
@var1 = field1,
@var2 = field2,
@var3 = field3
from
table
where
condition
Если это то, что вы после
Ответ 3
вы можете сделать это:
SELECT
CustomerId,
FirstName,
LastName,
Email
INTO #tempCustomer
FROM
Customer
WHERE
CustomerId = @CustomerId
а затем
SELECT CustomerId FROM #tempCustomer
вам не нужно объявлять структуру #tempCustomer
Ответ 4
Похоже, ваш синтаксис немного вышел из строя. У этого есть некоторые хорошие примеры
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
Ответ 5
Похоже, вам нужны временные таблицы.
http://www.sqlteam.com/article/temporary-tables
Обратите внимание, что #TempTable доступен на вашем SP.
Обратите внимание, что ## TempTable доступен для всех.
Ответ 6
"SELECT *
INTO
@TempCustomer
FROM
Customer
WHERE
CustomerId = @CustomerId"
Это означает создание нового @tempCustomer
tablevariable и вставки данных FROM Customer. Вы уже заявили об этом выше, поэтому не нужно снова объявлять. Лучше пойти с
INSERT INTO @tempCustomer SELECT * FROM Customer