it-swarm.asia

مزود خدمة SQL INTO @ متغير؟

لدي الكود التالي في أحد برامج 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 !!!

هل هناك أي اقتراحات حول كيفية تحقيق شيء ما على غرار الخطوط دون استفسارات متعددة في نفس الجدول؟

218
bleepzter

لا يمكنك اختيار .. 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
189
RichardTheKiwi

إذا أردت تعيين بعض المتغيرات لاستخدامها لاحقًا ، فيمكنك القيام بها في طلقة واحدة باستخدام شيء ما على غرار هذه الخطوط:

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

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

إذا كان هذا هو نوع الشيء الذي تبحث عنه

454
dougajmcdonald

انت تستطيع فعل ذالك:

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

ثم في وقت لاحق

SELECT CustomerId FROM #tempCustomer

لا تحتاج إلى إعلان بنية #tempCustomer

30
Victor Ribeiro da Silva Eloy

يبدو أن بناء الجملة الخاص بك خارج قليلاً. هذا له بعض أمثلة جيدة

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
14
Pat L

يبدو وكأنك تريد الجداول temp. http://www.sqlteam.com/article/tporary-tables

لاحظ أن #TempTable متاح في جميع أنحاء SP.

لاحظ أن ## TempTable متاح للجميع.

2
Valamas

لقد وجدت سؤالك تبحث عن حل لنفس المشكلة ؛ وما هي الإجابات الأخرى التي تفشل في الإشارة إليها هي طريقة لاستخدام متغير لتغيير اسم الجدول لكل تنفيذ لإجراءاتك في نموذج دائم ، وليس مؤقتًا.

حتى الآن ما أقوم به هو تسلسل رمز 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 '[email protected]_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

آمل أن يكون هذا مفيدًا ، لكن قد يكون الأمر مرهقًا إذا كانت الشفرة كبيرة جدًا ، لذا إذا وجدت طريقة أفضل ، فيرجى مشاركتها!

0
Rodrigo