2012-03-07 15 views
14

से डायनामिक एसक्यूएल कॉल करें मैं एक फ़ंक्शन लिख रहा हूं जो एक टेबल लौटाता है। फ़ंक्शन में पास किए गए दो पैरामीटर हैं और एक क्वेरी को बनाया और निष्पादित किया जाता है और लौटने वाली तालिका में डाला जाता है। हालांकि मुझे यह त्रुटि मिल रही है।फ़ंक्शन

केवल फ़ंक्शंस और कुछ विस्तारित संग्रहीत प्रक्रियाओं को फ़ंक्शन के भीतर से निष्पादित किया जा सकता है।

मैं संग्रहीत प्रक्रिया का उपयोग नहीं करना चाहता क्योंकि यह एक साधारण उपयोगिता कार्य है। क्या किसी को पता है कि यह किया जा सकता है। मेरा फ़ंक्शन नीचे कोड किया गया है, यह किसी निश्चित तालिका के भीतर किसी निश्चित कॉलम के लिए डुप्लिकेट की जांच करता है।

-- ============================================= 
-- AUTHOR:  JON AIREY 
-- THIS FUNCTION WILL RETURN A COUNT OF HOW MANY 
-- TIMES A CERTAIN COLUMN VALUE APPEARS IN A 
-- TABLE. THIS IS HELPFUL FOR FINDING DUPES. 

-- THIS FUNCTION WILL ACCEPT A COLUMN NAME, TABLE 
-- NAME (MUST INCLUDE SCHEMA), AND OPTIONAL 
-- DATABASE TO USE. RESULTS WILL BE RETURNED AS 
-- A TABLE. 
-- ============================================= 
ALTER FUNCTION [dbo].[fn_FindDupe] 
( 
-- Add the parameters for the function here 
@Column  VARCHAR(MAX), 
@Table  VARCHAR(100), 
@Database VARCHAR(100) = '' 
) 
RETURNS 
@TempTable TABLE 
     ([Column] varchar(100) 
     ,[Count] int) 
AS 
BEGIN 
    DECLARE @SQL VARCHAR(MAX) 
    SET @Table = CASE 
         WHEN @Database = '' 
         THEN @Table 
         ELSE @Database + '.' + @Table 
        END 

    SET @SQL = 

    ' 
     INSERT INTO @TempTable 

     SELECT  ' + @Column + ' 
        ,COUNT(' + @Column + ') AS CNT 
     FROM  ' + @Table + ' 
     GROUP BY ' + @Column + ' 
     ORDER BY CNT DESC 
    ' 

    EXEC SP_EXECUTESQL @SQL 

RETURN 
END 
GO 

उत्तर

21

You can't use dynamic sql in a udf:

यह बहुत ही सरल: आप इस्तेमाल से परिभाषित कार्यों T-SQL में लिखा से गतिशील एसक्यूएल का उपयोग नहीं कर सकते हैं। ऐसा इसलिए है क्योंकि आपको यूडीएफ में कुछ भी करने की अनुमति नहीं है जो डेटाबेस स्थिति को बदल सकता है (क्योंकि यूडीएफ किसी क्वेरी के हिस्से के रूप में लागू किया जा सकता है)। चूंकि आप डायनामिक एसक्यूएल से कुछ भी कर सकते हैं, अपडेट सहित, यह स्पष्ट है कि डायनामिक एसक्यूएल की अनुमति क्यों नहीं है।

...

एसक्यूएल 2005 में और बाद में, आप एक CLR समारोह के रूप में अपने कार्य को लागू कर सकते हैं। याद रखें कि सीएलआर से सभी डेटा एक्सेस गतिशील एसक्यूएल है। (आप सुरक्षित हैं, इसलिए यदि आप से अपने फ़ंक्शन को अपडेट ऑपरेशन करते हैं, तो आप पकड़े जाएंगे।) हालांकि चेतावनी का एक शब्द: डेटा स्केलर यूडीएफ से एक्सेस अक्सर प्रदर्शन की समस्याएं दे सकता है।

+0

मैं इसे सीएलआर फ़ंक्शन कैसे बना सकता हूं? – JBone

+0

[कैसे करें: एक सीएलआर SQL सर्वर उपयोगकर्ता-परिभाषित फ़ंक्शन बनाएं और चलाएं] (http://msdn.microsoft.com/en-us/library/w2kae45k (v = vs.80) .aspx) –

+1

'चूंकि आप कर सकते हैं डायनामिक एसक्यूएल से कुछ भी करें, अपडेट सहित, यह स्पष्ट है कि डायनामिक एसक्यूएल की अनुमति क्यों नहीं है। ', यह सही है। लेकिन साथ ही आपको अपने गतिशील एसक्यूएल को उदाहरण के साथ पार्स करना होगा। sp_executesql(), इसलिए SQL सर्वर में डेटा बदलने वाले प्रश्नों को पकड़ने और दूसरों को पास करने की हर संभावना है। तो असली कारण है - उन्होंने इसे लागू करने के लिए परेशान नहीं किया? –