V jednom z mých Sql (2008) Stored Procs mám následující kód, který funguje naprosto v pořádku:
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
Takže otázka pro vás je, že existuje možnost udělat něco v souladu s:
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
Abych mohl tato data znovu použít z paměti v dalších následujících tvrzeních? SQL Server hodí fit s výše uvedené prohlášení, ale já nechci muset vytvářet samostatné proměnné a inicializovat každou z nich pomocí samostatného příkazu SELECT proti stejné tabulce .... UGH !!!
Nějaké návrhy, jak dosáhnout něčeho na řádcích bez více dotazů proti stejné tabulce?
Nemůžete VYBRAT .. DO DO TABULKY VARIANTY. To nejlepší, co můžete udělat, je vytvořit jej nejprve a poté do něj vložit. Váš druhý úryvek musí být
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
Pokud jste chtěli jednoduše přiřadit některé proměnné pro pozdější použití, můžete je udělat v jednom záběru s něčím v těchto řádcích:
declare @var1 int,@var2 int,@var3 int;
select
@var1 = field1,
@var2 = field2,
@var3 = field3
from
table
where
condition
Jestli je to ten typ věci, po které jsi
můžeš to udělat:
SELECT
CustomerId,
FirstName,
LastName,
Email
INTO #tempCustomer
FROM
Customer
WHERE
CustomerId = @CustomerId
pak později
SELECT CustomerId FROM #tempCustomer
nemusíte deklarovat strukturu #tempCustomer
Vypadá to, že vaše syntaxe je mírně mimo. To má několik dobré příklady
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
Pak později
SELECT CustomerId FROM @TempCustomer
Zní to, jako byste chtěli dočasné tabulky. http://www.sqlteam.com/article/temporary-tables
#TempTable je k dispozici v celém SP.
Všimněte si, že ## TempTable je k dispozici všem.
Našel jsem vaši otázku při hledání řešení stejného problému; a jiné odpovědi, které nedokážou poukázat, je způsob, jak pomocí proměnné změnit název tabulky pro každé provedení vaší procedury v trvalé formě, nikoli dočasné.
Zatím dělám zřetězení celého kódu SQL s použitými proměnnými. Takhle:
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 '[email protected]_name+'
FROM my_view
WHERE string = ''Strings must use double apostrophe''
');
Doufám, že to pomůže, ale mohlo by to být těžkopádné, pokud je kód příliš velký, takže pokud jste našli lepší způsob, prosím, sdílejte!