क्या टी-एसक्यूएल में एक मौजूदा तालिका से विशुद्ध रूप से एक स्क्रिप्ट बनाने का एक तरीका है (जो कि एसएमओ का उपयोग किए बिना है, क्योंकि टी-एसक्यूएल में एसएमओ तक पहुंच नहीं है)। मान लीजिए कि एक संग्रहीत प्रक्रिया है जो एक तालिका नाम प्राप्त करती है और एक स्ट्रिंग देती है जिसमें दी गई तालिका के लिए स्क्रिप्ट बनाते हैं?
अब मुझे उस स्थिति का वर्णन करना चाहिए जिसका मैं सामना कर रहा हूं, क्योंकि इससे संपर्क करने का एक अलग तरीका हो सकता है। मेरे पास कई दर्जन डेटाबेस के साथ एक उदाहरण है। इन डेटाबेस में सभी एक ही स्कीमा, सभी समान टेबल, इंडेक्स और इतने पर हैं। उन्हें तीसरे पक्ष के सॉफ़्टवेयर इंस्टॉलेशन के एक भाग के रूप में बनाया गया था। मुझे उनके साथ काम करने का एक तरीका होना चाहिए ताकि मैं उनसे तदर्थ तरीके से डेटा एकत्र कर सकूं। Dba.se में अच्छे लोग पहले ही मेरी मदद कर चुके हैं कि एक अलग डेटाबेस में ट्रिगर कैसे बनाएं?
वर्तमान में मुझे सभी डेटाबेस में एक तालिका से चयन करने का एक तरीका खोजने की आवश्यकता है। मैंने सभी डेटाबेस नामों को एक तालिका में दर्ज किया है Databasees
और मैंने निम्नलिखित स्क्रिप्ट को उन सभी पर एक चयन कथन को निष्पादित करने के लिए लिखा है:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp
select * into #tmp from Database1.dbo.Table1 where 1=0
DECLARE @statement nvarchar(max) =
N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1'
DECLARE @LastDatabaseID INT
SET @LastDatabaseID = 0
DECLARE @DatabaseNameToHandle varchar(60)
DECLARE @DatabaseIDToHandle int
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
WHILE @DatabaseIDToHandle IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX) = QUOTENAME(@DatabaseNameToHandle) + '.dbo.sp_executesql'
EXEC @sql @statement
SET @LastDatabaseID = @DatabaseIDToHandle
SET @DatabaseIDToHandle = NULL
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
END
select * from #tmp
DROP TABLE #tmp
हालाँकि उपरोक्त स्क्रिप्ट निम्न संदेश के साथ विफल है:
तालिका '#tmp' में पहचान कॉलम के लिए एक स्पष्ट मूल्य केवल तब निर्दिष्ट किया जा सकता है जब एक कॉलम सूची का उपयोग किया जाता है और IDENTITY_INSERT चालू होता है।
इसे जोड़ना:
SET IDENTITY_INSERT #tmp ON
मदद नहीं करता है, क्योंकि, मैं कॉलम सूची निर्दिष्ट नहीं कर सकता और इसे सामान्य रख सकता हूं।
SQL में किसी दिए गए टेबल पर पहचान को स्विच करने का कोई तरीका नहीं है। आप केवल एक कॉलम ड्रॉप कर सकते हैं और एक कॉलम जोड़ सकते हैं, जो स्पष्ट रूप से कॉलम ऑर्डर को बदल देता है। और यदि स्तंभ क्रम बदलता है, तो आपको, फिर से, कॉलम सूची को निर्दिष्ट करने की आवश्यकता है, जो आपके द्वारा क्वेरी की गई तालिका के आधार पर भिन्न होगी।
तो मैं सोच रहा था कि क्या मैं अपने टी-एसक्यूएल कोड में टेबल टेबल क्रिएट कर सकता हूं, मैं पहचान कॉलम को हटाने के लिए स्ट्रिंग हेरफेर अभिव्यक्तियों के साथ हेरफेर कर सकता हूं और परिणाम के सेट के लिए डेटाबेस के नाम के लिए एक कॉलम भी जोड़ सकता हूं ।
क्या कोई भी मुझे प्राप्त करने के लिए अपेक्षाकृत आसान तरीका सोच सकता है?