لدي الكود التالي في أحد برامج 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 !!!
هل هناك أي اقتراحات حول كيفية تحقيق شيء ما على غرار الخطوط دون استفسارات متعددة في نفس الجدول؟
لا يمكنك اختيار .. 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
إذا أردت تعيين بعض المتغيرات لاستخدامها لاحقًا ، فيمكنك القيام بها في طلقة واحدة باستخدام شيء ما على غرار هذه الخطوط:
declare @var1 int,@var2 int,@var3 int;
select
@var1 = field1,
@var2 = field2,
@var3 = field3
from
table
where
condition
إذا كان هذا هو نوع الشيء الذي تبحث عنه
انت تستطيع فعل ذالك:
SELECT
CustomerId,
FirstName,
LastName,
Email
INTO #tempCustomer
FROM
Customer
WHERE
CustomerId = @CustomerId
ثم في وقت لاحق
SELECT CustomerId FROM #tempCustomer
لا تحتاج إلى إعلان بنية #tempCustomer
يبدو أن بناء الجملة الخاص بك خارج قليلاً. هذا له بعض أمثلة جيدة
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
يبدو وكأنك تريد الجداول temp. http://www.sqlteam.com/article/tporary-tables
لاحظ أن #TempTable متاح في جميع أنحاء SP.
لاحظ أن ## TempTable متاح للجميع.
لقد وجدت سؤالك تبحث عن حل لنفس المشكلة ؛ وما هي الإجابات الأخرى التي تفشل في الإشارة إليها هي طريقة لاستخدام متغير لتغيير اسم الجدول لكل تنفيذ لإجراءاتك في نموذج دائم ، وليس مؤقتًا.
حتى الآن ما أقوم به هو تسلسل رمز 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''
');
آمل أن يكون هذا مفيدًا ، لكن قد يكون الأمر مرهقًا إذا كانت الشفرة كبيرة جدًا ، لذا إذا وجدت طريقة أفضل ، فيرجى مشاركتها!