سؤال

لماذا لا يمكنك القيام بذلك وهل هناك حل بديل؟

تحصل على هذا الخطأ.

MSG 2714 ، المستوى 16 ، الحالة 1 ، السطر 13 هناك بالفعل كائن يسمى "#Teventable" في قاعدة البيانات.

declare @x int

set @x = 1

if (@x = 0)
begin
    select 1 as Value into #temptable
end
else
begin
   select 2 as Value into #temptable
end

select * from #temptable

drop table #temptable
هل كانت مفيدة؟

المحلول

يتكون هذا السؤال من جزأين، وبينما يقدم كيف فيرتشايلد إجابة جيدة للسؤال الثاني، فإنه يتجاهل السؤال الأول تمامًا - لماذا يتم إنتاج الخطأ؟

تكمن الإجابة في الطريقة التي يعمل بها المعالج المسبق.هذا

SELECT field-list INTO #symbol ...

يتم حلها في شجرة تحليل تعادل مباشرة

DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...

وهذا يضع #symbol في جدول أسماء النطاق المحلي.العمل مع _sessionid هو تزويد كل جلسة مستخدم بمساحة اسم خاصة؛إذا قمت بتحديد تجزئتين (##symbol) فسيتم منع هذا السلوك.إن عملية إلغاء وإلغاء امتداد معرف الجلسة هي عملية شفافة (من الواضح).

والنتيجة من كل هذا هي أن عبارات INTO #symbol المتعددة تنتج إعلانات متعددة في نفس النطاق، مما يؤدي إلى Msg 2714.

نصائح أخرى

لا يمكنك القيام بذلك بسبب تحليل الاسم المؤجل، يمكنك القيام بذلك باستخدام جدول حقيقي، فقط قم بإزالة علامات الجنيه

يمكنك أيضًا إنشاء الجدول المؤقت أولاً في الأعلى ثم إجراء إدراج عادي في الجدول

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

ستجد أنه أكثر موثوقية بهذه الطريقة.

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN
DROP TABLE #temptable
END

CREATE TABLE #temptable (Value INT)

declare @x int

set @x = 1

if (@x = 0)
begin
    INSERT INTO #temptable (Value) select 1
end
else
begin
    INSERT INTO #temptable (Value) select 2
end

select * from #temptable

drop table #temptable

ونأمل أيضًا أن تكون أسماء الجدول والحقول مبسطة لمثالك وليست كما أنت حقًا اتصل بهم ؛)

-- كيفن فيرتشايلد

يعد تحليل الاسم المؤجل أيضًا سبب عدم قدرتك على التأكد من أن sp_depends يعيد النتائج الصحيحة، راجع هذا المنشور الذي كتبته منذ فترة هل تعتمد على sp_depends (لا يقصد التورية)

سأخمن أن المشكلة تكمن في أنك لم تخلق #المغري.

آسف، لا أستطيع أن أكون أكثر تفصيلاً ولكن نظرًا لأنك لم تحاول حتى شرح ما تراه، فإنك تحصل على إجابة أقل من ممتازة.

من مظهر الكود يبدو أنك ربما كنت تقوم بإعداد نماذج أولية لهذا في SQL Studio أو ما شابه ذلك، أليس كذلك؟هل يمكنني تخمين أنك قمت بتشغيل هذا عدة مرات ووصلت إلى النقطة التي تم إنشاؤها فيها #إغراءًا ولكنها فشلت بعد ذلك قبل أن تصل إلى النهاية وتسقط الجدول مرة أخرى؟أعد تشغيل أداة تحرير SQL التي تستخدمها وحاول مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top