2012-03-05 18 views
11

मैं विशिष्ट रिकॉर्ड की गिनती प्राप्त करना चाहता हूं। तो मेरी क्वेरी निम्नलिखित की तरह दिखाई देगा ...फ़ंक्शन के भीतर से अस्थायी तालिकाओं तक नहीं पहुंच सकता

SELECT 
    ID, 
    NAME, 
    (SELECT...) AS UserCount // Stmt1 
FROM MyTable 

मुद्दा यह है कि, 'Stmt1' एक जटिल बयान है और यह innerquery रूप में नहीं लिखा जा सकता है। ठीक है, मैं कार्यों का उपयोग कर सकते हैं, लेकिन बयान 'टेबल बनाएँ' तो मैं निम्न त्रुटि संदेश

Cannot access temporary tables from within a function.

सबसे अच्छा तरीका कार्य को पूरा करने में क्या है मिल भी शामिल है?

उत्तर

18

आप अपनी समस्या का समाधान करने के लिए उपयोगकर्ता परिभाषित तालिका प्रकार का उपयोग कर सकते हैं।

तुम बस की तरह

CREATE TYPE [dbo].[yourTypeName] AS TABLE(
    [columeName1] [int] NULL, 
    [columeName2] [varchar](500) NULL, 
    [columeName3] [varchar](1000) NULL 
) 
GO 

एक मेज चर बना सकते हैं और आप की तरह

CREATE FUNCTION [dbo].[yourFunctionName] 
( 
    @fnVariable1 INT , 
    @yourTypeNameVariable yourTypeName READONLY 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 

    SELECT ................. 
     FROM @yourTypeNameVariable 
     WHERE ........ 
    RETURN @r 
END 

अपने प्रक्रिया पर अपने कार्य में इस तालिका चर घोषणा कर सकते हैं आप

DECLARE @yourTypeNamevaribale AS yourTypeName 
की तरह अपने तालिका प्रकार घोषणा कर सकते हैं

और आप इस तालिका में मान डाल सकते हैं जैसे

insert into @yourTypeNamevaribale (col,col,..)values(val,val,..) 

तरह

dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale) 

इस विधि के लिए जाना कृपया अपने कार्य को यह पास, धन्यवाद आप

2

हाँ आप #temp तालिका का उपयोग नहीं कर सकते हैं।

जैसा कि आप SQL Server 2008 का उपयोग कर रहे हैं, आप #temp तालिकाओं के बजाय तालिका चर का उपयोग क्यों नहीं करते? इसे आज़माएं।

+0

सहमत टेबल के रूप में घोषित @TempTable का उपयोग की कुल संख्या दिखाने के लिए है ( elementid पूर्णांक, तत्व VARCHAR (8000) ) बजाय #table –

1

मैं इस पोस्ट में आए जैसा कि मैंने तालिका वैरिएबल का उपयोग शुरू कर दिया और प्रदर्शन कारणों से अस्थायी रूप तालिकाओं के लिए बंद केवल फ़ंक्शन में अस्थायी तालिकाओं को ढूंढने के लिए उपयोग नहीं किया जा सका।

तालिका चर का उपयोग करने में मुझे संकोच होगा, खासकर यदि आप बड़े परिणाम सेट के साथ खेल रहे हैं, क्योंकि ये स्मृति में हैं। एक और तालिका समारोह में अस्थायी तालिका परिणाम निकाला जा रहा है यह पोस्ट देखें ...

http://totogamboa.com/2010/12/03/speed-matters-subquery-vs-table-variable-vs-temporary-table/

अन्य विकल्प होगा ..

  1. सबक्वेरी का उपयोग कर
+0

तालिका चर "केवल स्मृति में" संग्रहीत नहीं हैं: http://sqlserverplanet.com/tsql/yet-another-temp-tables-vs-table-variables-article –

0

में कोड परिवर्तित मामलों की 99,99% में अस्थायी टेबल या सबक्वेरी, लेकिन COUNT कार्यों की तरह उपयोग एकत्रीकरण, SUM या AVG संयोजन में साथ साथ किसी भी चाल की कोई जरूरत नहीं है OVER clause और (अक्सर) PARTITION BY

मुझे यकीन नहीं है कि ओपी ने क्या हासिल करने की कोशिश की लेकिन मुझे लगता है कि उपयोगकर्ता गणना किसी भी तरह MyTable में मानों से संबंधित है। तो UserCount उत्पन्न करने वाली किसी भी तालिका में MyTable में शामिल होने का एक तरीका होना चाहिए।

सबसे सरल उदाहरण सभी उपयोगकर्ताओं और उपयोगकर्ताओं

SELECT id 
    , name 
    , user_count = COUNT(*) OVER() 
FROM MyUsers 
संबंधित मुद्दे