J'ai le code suivant dans l'un de mes procs stockés Sql (2008) qui s'exécute parfaitement:
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
Donc, la question pour vous est la possibilité de faire quelque chose comme:
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
Afin que je puisse réutiliser ces données de la mémoire dans d'autres déclarations suivantes? SQL Server jette un ajustement avec l'instruction ci-dessus, mais je ne veux pas avoir à créer des variables distinctes et initialiser chacune d'entre elles via une instruction SELECT distincte contre la même table .... UGH !!!
Avez-vous des suggestions sur la façon de réaliser quelque chose le long des lignes sans plusieurs requêtes sur la même table?
sql
sql-server
tsql
sql-server-2008
bleepzter
la source
la source
declare @t table
une fois, et si vous avez besoin de le réutiliser, tirez unDELETE @TempCustomer
avant de l'insérer à nouveauRéponses:
Vous ne pouvez pas CHOISIR .. DANS .. UNE VARIABLE DE TABLE. Le mieux que vous puissiez faire est de le créer d'abord, puis de l'insérer. Votre 2e extrait doit être
la source
Si vous vouliez simplement assigner certaines variables pour une utilisation ultérieure, vous pouvez les faire en une seule fois avec quelque chose comme ceci:
Si c'est le genre de chose que vous recherchez
la source
tu peux le faire:
puis plus tard
vous n'avez pas besoin de déclarer la structure de #tempCustomer
la source
DROP TABLE #tempCustomer
quand#tempCustomer
n'est plus nécessaire sinon la prochaine sélection provoquera une#tempCustomer already exists
erreurIl semble que votre syntaxe soit légèrement dépassée. Cela a de bons exemples
Puis plus tard
la source
On dirait que vous voulez des tables temporaires. http://www.sqlteam.com/article/temporary-tables
Notez que #TempTable est disponible dans tout votre SP.
Notez que ## TempTable est disponible pour tous.
la source
J'ai trouvé votre question à la recherche d'une solution au même problème; et ce que les autres réponses ne parviennent pas à indiquer, c'est un moyen d'utiliser une variable pour changer le nom de la table pour chaque exécution de votre procédure sous une forme permanente, et non temporaire.
Jusqu'à présent, je concatène l'intégralité du code SQL avec les variables à utiliser. Comme ça:
J'espère que cela aide, mais cela pourrait être fastidieux si le code est trop volumineux, donc si vous avez trouvé une meilleure façon, veuillez partager!
la source
Ce qui signifie créer une nouvelle
@tempCustomer
table variable et insérer des données du client. Vous l'aviez déjà déclaré ci-dessus, donc pas besoin de le déclarer à nouveau. Mieux vaut aller avecla source