2011-08-29 7 views
41
DECLARE @dbName nvarchar(128) = 'myDb' 
DECLARE @siteId int 
exec ('SELECT TOP 1 @siteId = Id FROM ' + @dbName + '..myTbl') 
select @siteId 

ऊपर मैं निम्न त्रुटिटी-एसक्यूएल में 'execute' का उपयोग कर वैरिएबल को वैल्यू कैसे सेट करें?

Msg 137, Level 15, State 1, Line 1 
Must declare the scalar variable "@siteId". 

(1 row(s) affected) 

क्यों और कैसे इसे ठीक करने के लिए मिल जब मैं स्क्रिप्ट चलाने?

धन्यवाद

उत्तर

82

द्वारा बाहरी ऑर्डर द्वारा गारंटी दी जाती है आप sp_executesql के साथ आउटपुट पैरामीटर का उपयोग कर सकते हैं।

DECLARE @dbName nvarchar(128) = 'myDb' 
DECLARE @siteId int 
DECLARE @SQL nvarchar(max) = N'SELECT TOP 1 @siteId = Id FROM ' + quotename(@dbName) + N'..myTbl' 
exec sp_executesql @SQL, N'@siteId int out', @siteId out 
select @siteId 
+1

+1 यह अच्छा तरीका है। मैंने एक पैरामीटरयुक्त डेटाबेस नाम देखा और sp_executesql को खारिज कर दिया ... – gbn

+1

+1 अस्थायी तालिका बनाने पर कोई गरम नहीं – garik

20

गतिशील एसक्यूएल बाहरी, बुला एसक्यूएल के लिए एक अलग गुंजाइश है: तो @siteid

मान्यता प्राप्त नहीं है

आप गतिशील के बाहर एक अस्थायी तालिका/तालिका चर का उपयोग करना होगा एसक्यूएल:

DECLARE @dbName nvarchar(128) = 'myDb' 
DECLARE @siteId TABLE (siteid int) 

INSERT @siteId 
exec ('SELECT TOP 1 Id FROM ' + @dbName + '..myTbl') 

select * FROM @siteId 

नोट: टॉप एक आदेश द्वारा बिना व्यर्थ है। एक टेबल के लिए कोई प्राकृतिक, निहित या आंतरिक आदेश नहीं है। किसी भी ऑर्डर को केवल

+0

"एक ORDER BY बिना टॉप व्यर्थ है" - अर्थहीन शायद थोड़ा मजबूत यहाँ, है शायद सब मैं चाहता हूँ 1 रिकॉर्ड है और मुझे परवाह नहीं है जो, यानी क्या रेस्टोरेंट मैं आज रात में खाना चाहिए ? – RyanfaeScotland

+0

@RyanfaeScotland: शायद, लेकिन फिर एसक्यूएल में कोई 'कोई() 'फ्यूशन नहीं है जो आर्बिट्रे पंक्तियां देता है। अन्यथा मैं कुछ प्रश्नों पर भरोसा करने के बजाय हर बार एक ही तरीके से व्यवहार करना चाहता हूं। – gbn

+0

आपका नोट बस अधिकांश व्यावहारिक परिदृश्यों में सच नहीं है। एक *** बनाए रखा ***, तालिका पर क्लस्टर सूचकांक तालिका परिणामों के लिए एक सतत, अनुमानित आदेश सुनिश्चित करेगा। – Matt

0
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Andrew Foster 
-- Create date: 28 Mar 2013 
-- Description: Allows the dynamic pull of any column value up to 255 chars from regUsers table 
-- ============================================= 
ALTER PROCEDURE dbo.PullTableColumn 
(
    @columnName varchar(255), 
    @id int 
) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @columnVal TABLE (columnVal nvarchar(255)); 

    DECLARE @sql nvarchar(max); 
    SET @sql = 'SELECT ' + @columnName + ' FROM regUsers WHERE id=' + CAST(@id AS varchar(10)); 
    INSERT @columnVal EXEC sp_executesql @sql; 

    SELECT * FROM @columnVal; 
END 
GO 
संबंधित मुद्दे