31

यहाँ मेरी उपयोगकर्ता परिभाषित तालिका प्रकार है ...एसक्यूएल सर्वर 2008 - मैं तालिका-मूल्यवान फ़ंक्शन से उपयोगकर्ता-परिभाषित तालिका प्रकार कैसे लौटा सकता हूं?

CREATE TYPE [dbo].[FooType] AS TABLE(
[Bar] [INT], 
) 

इस Ive मेरी मेज-मान समारोह में क्या करना प्रकार लौटना पड़ा क्या है:

CREATE FUNCTION [dbo].[GetFoos] 
RETURN @FooTypes TABLE ([Bar] [INT]) 
INSERT INTO @FooTypes (1) 
RETURN 

असल में, फिर से करने के लिए im - फ़ंक्शन के रिटर्न स्टेटमेंट में मेरी टाइप परिभाषा बताएं। क्या कोई तरीका नहीं है कि मैं बस रिटर्न स्टेटमेंट में टाइप घोषित कर सकता हूं?

मैं सोचा होगा यह काम करेगा:

CREATE FUNCTION [dbo].[GetFoos] 
RETURN @FooTypes [FooType] 
INSERT INTO @FooTypes (1) 
RETURN 

इस .... किसी के बारे में MSDN/गूगल पर किसी भी मदद नहीं मिल रहा?

संपादित

मैं अपने जवाब में अचिह्नित, और इस सवाल जोड़ने से - के रूप में मैं एक ही परिदृश्य 6 महीने बाद का सामना कर रहा हूँ।

क्या किसी को कोई विचार है यदि किसी तालिका मूल्यवान फ़ंक्शन से उपयोगकर्ता परिभाषित तालिका प्रकार को वापस करना संभव है? यदि नहीं, तो क्या मैंने किया है इसके अलावा कोई बेहतर कामकाज है? (फिर से फिर से घोषित करें)।

+0

2014 के साथ अभी भी संभव नहीं है। – dudeNumber4

उत्तर

9

ठीक है - तो यह नहीं किया जा सकता है।

रिटर्न प्रकार (स्क्रिप्टिंग के उपयोग के साथ) में तालिका परिभाषा को डुप्लिकेट करने के लिए पर्याप्त आसान है।

फिर भी - उम्मीद है कि यह समस्या SQL सर्वर के अगले संस्करण में ठीक हो जाएगी।

+2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन IMVHO आपको अपना जवाब अनमार्क करना चाहिए और जेम्स से जवाब को चिह्नित करना चाहिए क्योंकि यह स्पष्ट रूप से इस मुद्दे को हल करता है और हल करता है। – slugster

0

मुझे विश्वास नहीं है कि यह संभव है। आप एक यूडीटीटी का उपयोग स्केलर-वैल्यूएड फ़ंक्शन के रिटर्न प्रकार के रूप में नहीं कर सकते क्योंकि यह स्केलर मान नहीं है। आप एक यूडीटीटी के साथ तालिका-मूल्यवान फ़ंक्शन की तालिका घोषणा को प्रतिस्थापित नहीं कर सकते हैं। तालिका परिभाषा को दोहराना एकमात्र विकल्प प्रतीत होता है। अगर हम जानते थे कि आप ऐसा क्यों कर रहे थे, तो शायद हमें एक विकल्प मिल सके।

+1

मुझे पता है कि मैं एक स्केलर फ़ंक्शन से यूडीटी वापस नहीं कर सकता। लेकिन तालिका कार्यों के संबंध में - आप टेबल (या तालिका चर) वापस करने में सक्षम हैं। एक यूडीटी सिर्फ एक और टेबल है इसलिए यह नहीं देख सकता कि आप इसे वापस क्यों नहीं कर सकते। ओह ठीक है, शायद एसएस के अगले संस्करण में। =) मैं ऐसा कर रहा हूं क्योंकि मेरे पास एक टेबल चर है जिसे कई कार्यों/procs के बीच डुप्लिकेट किया जा रहा था। इसलिए मैंने इसे "डीआरवाई" होने से रोकने के लिए एक यूडीटी में रखा। बनाए रखने के लिए आसान, आदि – RPM1984

2

CREATE FUNCTION के लिए वाक्यविन्यास इंगित करता है कि तालिका वापसी प्रकार को परिभाषित करने का एकमात्र तरीका कॉलम और प्रकार, <table_type_definition> सूचीबद्ध करना है। यहां तक ​​कि SQL Server "Denali" में <table_type_definition> के लिए समान परिभाषा है। हालांकि आश्चर्यजनक रूप से, यह वाक्यविन्यास में बहु-कथन तालिका मूल्यवान फ़ंक्शंस, या कुछ भी नहीं है जो इस खंड को संदर्भित करता है।

+3

तो मुझे लगता है कि उत्तर अभी भी नहीं है। :) डांग। मैं यहां प्राप्त करने की कोशिश कर रहा हूं, यूडीएफ और कोड जो इसे कॉल कर रहा है, के बीच "अनुबंध" का एक प्रकार है। टी-एसक्यूएल "डी-आर-वाई" रखता है। यहां यूडीटीटी का उपयोग करने के बारे में बहुत कुछ नहीं है अगर मैं इसे फ़ंक्शन से वापस नहीं कर सकता। ओह अच्छा। फिर भी धन्यवाद। – RPM1984

0

नहीं, इस समय डर नहीं, this question के अनुसार। और MSDN से निम्नलिखित:

प्रतिबंध

टेबल-मान पैरामीटर निम्नलिखित प्रतिबंध होते हैं:

  • एसक्यूएल सर्वर तालिका-मान मापदंडों के स्तंभों पर आंकड़े को बनाए रखने नहीं है।

  • तालिका-मूल्यवान पैरामीटर ट्रांसएक्ट-एसक्यूएल रूटीन के लिए इनपुट रीडोनली पैरामीटर के रूप में पारित किया जाना चाहिए। आप नियमित रूप से शरीर में तालिका-मूल्यवान पैरामीटर पर अद्यतन, डिलीट, या INSERT जैसे डीएमएल संचालन नहीं कर सकते हैं।

  • आप किसी तालिका-मूल्य वाले पैरामीटर का उपयोग किसी चयन INTO या INSERT EXEC कथन के लक्ष्य के रूप में नहीं कर सकते हैं। एक तालिका-मूल्यवान पैरामीटर SELECT INTO के FROM खंड में या INSERT EXEC स्ट्रिंग या संग्रहीत प्रक्रिया में हो सकता है।

21

भले ही आप एक समारोह से UDTT वापस नहीं लौट सकते, तो आप एक तालिका चर लौट सकते हैं और स्कीमा मैच के रूप में के रूप में लंबे समय से एक UDTT में इसे प्राप्त कर सकते हैं। UDTT

CREATE TYPE dbo.MyCustomUDDT AS TABLE 
(
    FieldOne varchar (512), 
    FieldTwo varchar(1024) 
) 

बनाएँ - - निम्नलिखित कोड एसक्यूएल सर्वर में 2008 R2

परीक्षण किया जाता है अपने चर घोषित

DECLARE @uddt MyCustomUDDT; 
DECLARE @Modifieduddt MyCustomUDDT; 

// समारोह

INSERT INTO @Modifieduddt SELECT * FROM dbo.MyUDF(@uddt); 
कॉल

फ़ंक्शन हस्ताक्षर

CREATE FUNCTION dbo.MyUDF(@localUDDT MyCustomUDDT) 
RETURNS @tableVar TABLE 
(
    FieldOne varchar (512), 
    FieldTwo varchar(1024) 
) 
AS 
BEGIN 
--Modify your variable here 
RETURN 
END 

उम्मीद है कि यह किसी की मदद करेगा।

+0

यह वर्तमान में चिह्नित एक से बेहतर जवाब है। – slugster

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