पृष्ठभूमि: एक संग्रहीत प्रक्रिया है जो किसी दिए गए नाम की अस्थायी तालिका के साथ "सामान" करती है। प्रक्रिया सामान्य है कि यह अस्थायी तालिका की स्कीमा का निरीक्षण करती है और फिर स्कीमा के आधार पर अलग-अलग "सामान" करती है। मैं समझता हूं कि यह थोड़ा अजीब है लेकिन मैं इसे बदलने के लिए अनिच्छुक हूं क्योंकि यह सभी स्थितियों में ठीक काम करता है ....SQL सर्वर क्यों सोचता है कि एक Temp तालिका पहले से मौजूद है जब यह नहीं है?
यदि मेरे पास एक संग्रहीत प्रक्रिया है जो एक temp तालिका के लिए दो अलग-अलग स्कीमा बनाती है वही नाम। तर्कसंगत रूप से यह केवल आईएफ की शाखा के आधार पर एक अस्थायी तालिका बनाता है। समस्या यह है कि जब sproc एसक्यूएल सर्वर द्वारा जाँच की है ऐसा लगता है जैसे कि यह अगर के दोनों किनारों मूल्यांकन कर रही है है
तो यह एसक्यूएल में विफल रहता है (अगर यह SQL सिंटैक्स की जाँच कर रहा है जो समझ में आता है।):
IF (1=1)
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL
)
END
ELSE
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL,
c BIGINT NOT NULL
)
END
--exec SomeProcedureWhichDoesStuffWith#Test
DROP TABLE #test
निम्न त्रुटि के साथ
:
Msg 2714, Level 16, State 1, Line 14
There is already an object named '#test' in the database.
आईएफएस अंदर ड्रॉप तालिका का कोई संयोजन (पहले या बाद में बनाने तालिका DDL) एसक्यूएल चेकर को पूरा करने लगता है।
कोई विचार मैं यह कैसे कर सकता हूं? क्या मैं, उदाहरण के लिए, एसक्यूएल को सिंटैक्स चेक नहीं करने के लिए कह सकता हूं और केवल स्पोक को स्वीकार कर सकता हूं?
हाँ धन्यवाद। दुर्भाग्य से यह एक स्पोक में टेबल बना रहा है, इसलिए इसे एक ही बैच में होना चाहिए (इसलिए यह गो पर नहीं है)। –