2012-02-23 9 views
16

किसी को भी मेरे विवरण में जांच कर सकता है ...एसक्यूएल चर

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName ='SELECT DISTINCT o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE ''%empty%''' 

SET @strSQL = 'INSERT INTO @tblName VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

मेरी त्रुटि है घोषित ...

संदेश 1087, स्तर 15, राज्य 2, पंक्ति 1
घोषित करना चाहिए टेबल चर "@tblName"।

+3

मुझे आशा है कि जो कुछ भी तालिका वापस आती है, वहां केवल दो कॉलम हैं, और डेटा प्रकार मिलान ... –

+0

@OMGPonies: आप निश्चित रूप से डालने योग्य कॉलम का मतलब है। –

उत्तर

6

सुनिश्चित नहीं हैं कि आप क्या करने की कोशिश कर रहे हैं कि वास्तव में क्या है, लेकिन मुझे लगता है कि आप कुछ इस तरह हैं:

DECLARE @tblName varchar(MAX), @strSQL varchar(MAX) 
SET @tblName = 
    (select distinct o.name as TableName 
    from sysobjects o 
    join sysindexes x on o.id = x.id 
    where o.name LIKE '%empty%') 
SET @strSQL = 'INSERT INTO [' + @tblName + '] VALUES(''trylng'', ''1'')' 
exec (@strSQL) 

कहा जा रहा है, वहाँ अभी भी कुछ चीज़ों यहाँ के लिए बाहर देखने के लिए कर रहे हैं। आपको उस स्थिति को संभालने की आवश्यकता है जहां SELECT DISTINCT एक रिकॉर्ड के अलावा कुछ भी लौटाता है। साथ ही, मैं वास्तव में गतिशील एसक्यूएल (@strSQL में) बनाने की आवश्यकता को समझ नहीं पा रहा हूं, जब @tblName हमेशा एक ही मान रखेगा (क्योंकि WHERE खंड में कोई चर नहीं है)। अपने "सामान्य" कोड लाइनों के दायरे - -

+1

+1, केवल एक नोट: आम तौर पर नामों को गतिशील स्क्रिप्ट में शामिल करना सुरक्षित है: 'इनरर्ट INTO' + QUOTENAME (@tblName) + '...' ', बस उनके चारों ओर स्क्वायर ब्रैकेट डालने के बजाय। –

+0

जानकारी के लिए धन्यवाद एंड्री –

+0

@AndriyM: कूल, टिप के लिए धन्यवाद! – rsbarro

12

आपका @tblName संपत्ति बाहरी गुंजाइश पर मौजूद है, लेकिन एसक्यूएल तुम वहाँ स्ट्रिंग में निर्माण कर रहे हैं के भीतर गुंजाइश पर नहीं ....

आप की जरूरत है पढ़ने के लिए अपनी लाइनों को बदलने के लिए:

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 

और फिर यह ठीक काम करना चाहिए।

इसके अलावा, आप अपने एसक्यूएल सर्वर संस्करण का उल्लेख नहीं कर रहे हैं - लेकिन SQL सर्वर 2005 या नए के रूप में, आप sysobjects और sysindexes का उपयोग कर बंद कर देना चाहिए - इसके बजाय, नई sys स्कीमा कि लगभग समान ही में जानकारी शामिल है का उपयोग करें - लेकिन अधिक आसानी से उपलब्ध है। करने के लिए आपकी क्वेरी को बदलें:

SET @tblName ='SELECT DISTINCT t.name as TableName 
       FROM sys.tables t 
       INNER JOIN sys.indexes i on i.object_id = t.object_id 
       WHERE t.name LIKE ''%empty%''' 

एक बहुत अधिक जानकारी के लिए देखें MSDN: Querying the SQL Server System Catalog क्या इसका पूरा लाभ उठाने के लिए नए sys स्कीमा में उपलब्ध है और तरीका बताया गया है पर!

"rsbarro" के रूप में इंगित किया गया: इस SQL ​​कथन को यहां उद्धरणों में डालना अजीब है - क्या आप EXEC(...) का उपयोग करके इस कथन को निष्पादित कर रहे हैं ?? लेकिन फिर आप मूल्य को @tblName संपत्ति पर वापस कैसे निर्दिष्ट करते हैं? वास्तव में नहीं है भावना .....

आप एक मूल्य प्राप्त करने के लिए वास्तव में इस क्वेरी चलाने के लिए चाहते हैं, आप कुछ इस तरह होना चाहिए:

SELECT TOP 1 @tblName = t.name 
FROM sys.tables t 
INNER JOIN sys.indexes i on i.object_id = t.object_id 
WHERE t.name LIKE '%empty%' 

आप में एक TOP 1 की आवश्यकता है सुनिश्चित करने के लिए केवल एक ही मूल्य प्राप्त करने के लिए - अन्यथा यह कथन विफल हो सकता है (यदि एकाधिक पंक्तियां चुनी जाती हैं)।

+0

क्या मुझे कुछ याद आ रही है? @ QublName एकल उद्धरण में क्यों लपेटा गया है? क्या यह सिर्फ स्ट्रिंग के बराबर सेट नहीं करेगा, न कि तालिका का नाम? – rsbarro

+0

नहीं, मेरा दूसरा कथन है। इसे उद्धरण के बिना 'SET @tblName = SELECT DISTINCT t.name ... को पढ़ना नहीं चाहिए? जिस तरह से यह लिखा है @strSQL के पास तालिका नाम के रूप में चयन DISTINCT t.Name में 'INSERT का मूल्य होगा ... '। मुझे लगता है कि अमान्य होगा, नहीं? – rsbarro

+0

@rsbarro: आह ठीक है - ठीक है, यकीन नहीं है - मुझे लगता है कि ओपी 'EXEC (....)' का उपयोग कर एसक्यूएल कथन निष्पादित करेगा। यदि नहीं - तो आप बिल्कुल सही हैं, यह काम नहीं करेगा! –

संबंधित मुद्दे