2009-01-13 11 views
8

हमारे पास एक SQL क्वेरी है जो डेटाबेस से कई तालिकाओं/दृश्यों से बड़ी संख्या में फ़ील्ड खींचती है। हमें किसी तृतीय पक्ष के साथ एकीकरण के लिए एक साथ एक स्पेक लगाने की आवश्यकता है, परिणाम सेट के डेटा प्रकारों को संकलित करने का सबसे तेज़ तरीका क्या है?एसक्यूएल के परिणामों की डेटाटाइप कैसे निर्धारित करें?

स्पष्टीकरण:

  • 25+ टेबल/शामिल देखा गया, तो तालिका स्तर पर काम करता है अभी भी बोझिल हो जाएगा रहे हैं।
  • वर्तमान में सभी काम माइक्रोसॉफ्ट एसक्यूएल सर्वर प्रबंधन स्टूडियो में किया जा रहा है।
+0

यह उन मूल्यों को पुनर्प्राप्त करने के लिए किस भाषा/प्लेटफ़ॉर्म का उपयोग किया जाता है, इस पर निर्भर करता है। –

उत्तर

5

आप SET FMTONLY ON के साथ क्वेरी चला सकते हैं, लेकिन हो सकता है कि आप आसानी से डेटा प्रकारों को आसानी से निर्धारित करने में मदद न करें, क्योंकि आप केवल प्रबंधन स्टूडियो में काम कर रहे हैं। यदि यह मैं था, तो मुझे लगता है कि मैं संग्रहीत प्रक्रिया के रूप में उसी शरीर के साथ अस्थायी रूप से एक दृश्य बनाउंगा (आपको किसी भी पैरामीटर के लिए चर घोषित करना पड़ सकता है)। फिर आप पहले से चर्चा की INFORMATION_SCHEMA क्वेरी के साथ दृश्य द्वारा लौटाए गए कॉलम देख सकते हैं।

+1

NFORMATION_SCHEMA क्वेरी का उपयोग करने के लिए दृश्य बनाना मुझे आवश्यक लापता चरण था! – Shawn

2

यदि आप SQL सर्वर का उपयोग कर रहे हैं, तो विभिन्न तालिकाओं से मेटाडेटा information_schema तालिका में उपलब्ध है।

SELECT * FROM information_schema.columns WHERE table_name = 'Foo' 
1

आप सी # उपयोग कर रहे थे आप इसे सही क्षेत्र से DataRow वस्तु में पहुंच सकता है::

Type columnNameType = row["columnName"].GetType(); 
2

और एक के लिए उदाहरण के लिए, इस क्वेरी तालिका फू, जारी करने के लिए स्तंभ मेटाडाटा पाने के लिए अतिरिक्त विकल्प आप उपयोग कर सकते

sp_help 'Table_Name' 

संपादित करें: इसके अलावा, sp_help किसी भी वस्तु के लिए इस्तेमाल किया जा सकता (यानी यह वापसी प्रकार का संकेत होगा संग्रहित प्रक्रिया इनपुट और आउटपुट चर के)

0

नोट करें कि परिणाम सेट मेटाडेटा तालिका मेटाडेटा से अलग है, क्योंकि SQL क्वेरी में अभिव्यक्तियां शामिल हो सकती हैं, जिनके डेटा प्रकार उन तालिकाओं में समान नहीं हो सकते हैं, जो वे पूछते हैं।

कई SQL क्वेरी इंटरफेस आपको परिणाम सेट मेटाडेटा (डेटाटाइप इत्यादि) के बारे में जानकारी पुनर्प्राप्त करने के लिए कुछ फ़ंक्शन देते हैं।

विशिष्ट एपीआई फ़ंक्शंस जिन्हें आप उपयोग करने की आवश्यकता है उस पर निर्भर करते हैं कि आप किस भाषा और क्वेरी इंटरफ़ेस का उपयोग कर रहे हैं। आपने यह नहीं कहा है।

उदाहरण के लिए, यदि आप ओडीबीसी का उपयोग कर रहे हैं, तो SQLDescribeCol() फ़ंक्शन आपको परिणाम सेट मेटाडेटा के बारे में जानकारी दे सकता है।

8

आप temp तालिका का उपयोग करके परिणाम कॉलम प्रकार देखने के लिए कुछ त्वरित SQL कथन का उपयोग कर सकते हैं।

टेम्पल टेबल एक दृश्य के बाद थोड़ा बेहतर है, क्योंकि वे कनेक्शन-स्थानीय दायरे हैं और डिस्कनेक्ट होने के बाद साफ़ हो जाएंगे।

आपको बस कुछ कीवर्ड इंजेक्षन का पालन के रूप में

SELECT 
TOP 0 -- to speed up without access data 
your,original,columns 
INTO #T -- temp table magic 
FROM originalTablesJoins 
Order by anything 
exec tempdb.sys.sp_columns #T 
drop table #T 

या है;

SELECT TOP 0 * FROM (
    select your,original,columns from originalTablesJoins -- remove order by if any 
) x 
exec tempdb.sys.sp_columns #T 
drop table #T 

नोट: View schema of resultset in SQL Server Management Studio

+0

दूसरे विकल्प के लिए मुझे करना था: शीर्ष 0 चुनें * से #T ... –

1

से प्रेरित यहाँ, एक है अगर आप सिर्फ SELECT ... INTO #Temp (याद #Temp सत्र के दायरे वाला सबसे खराब) कर सकते हैं https://stackoverflow.com/a/14328779/162273 से चोरी से कुछ के साथ:

SELECT 
    c.name AS UsefulRawName, 
    ',' + c.name + ' ' + UPPER(t.name) + 
     CASE 
      WHEN t.name IN ('char', 'nchar', 'varchar', 'nvarchar') THEN '(' + CAST(c.max_length AS VARCHAR(3)) + ')' 
      WHEN t.name IN ('decimal', 'numeric') THEN '(' + CAST(c.[precision] AS VARCHAR(3)) + ', ' + CAST(c.[scale] AS VARCHAR(3)) + ')' 
      ELSE '' END + CASE WHEN c.Is_Nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END AS SQLColumnType, 
    'public ' + 
     CASE 
      WHEN t.name IN ('varchar', 'nvarchar', 'text', 'ntext', 'char', 'nchar', 'xml', 'sysname') THEN 'string' 
      WHEN t.name IN ('binary', 'varbinary', 'image') THEN 'byte[]' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('uniqueidentifier') THEN 'Guid' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('datetimeoffset') THEN 'DateTimeOffset' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('date', 'time', 'datetime2', 'smalldatetime', 'datetime') THEN 'DateTime' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('numeric', 'decimal', 'real', 'money', 'smallmoney') THEN 'decimal' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('float') THEN 'float' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('tinyint', 'smallint') THEN 'short' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('int') THEN 'int' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('bit') THEN 'bool' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('bigint') THEN 'long' + CASE WHEN c.Is_Nullable = 1 THEN '?' ELSE '' END 
      WHEN t.name IN ('timestamp') THEN 'ulong' 
      ELSE 'object' END + ' ' + c.name + ' { get; set; }' AS CSColumnType, 
    c.name + ' = ' + 
     CASE 
      WHEN t.name IN ('varchar', 'nvarchar', 'text', 'ntext', 'char', 'nchar', 'xml', 'sysname') THEN 'reader["' + c.name + '"] as string,' 
      WHEN t.name IN ('binary', 'varbinary', 'image') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as byte[]?,' 
                 ELSE '(byte[])reader["' + c.name + '"],' END 
      WHEN t.name IN ('uniqueidentifier') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as Guid?,' 
                 ELSE '(Guid)reader["' + c.name + '"],' END 
      WHEN t.name IN ('datetimeoffset') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as DateTimeOffset?,' 
                 ELSE '(DateTimeOffset)reader["' + c.name + '"],' END 
      WHEN t.name IN ('date', 'time', 'datetime2', 'smalldatetime', 'datetime') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as DateTime?,' 
                 ELSE '(DateTime)reader["' + c.name + '"],' END 
      WHEN t.name IN ('numeric', 'decimal', 'real', 'money', 'smallmoney') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as decimal?,' 
                 ELSE '(decimal)reader["' + c.name + '"],' END 
      WHEN t.name IN ('float') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as float?,' 
                 ELSE '(float)reader["' + c.name + '"],' END 
      WHEN t.name IN ('tinyint', 'smallint') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as short?,' 
                 ELSE '(short)reader["' + c.name + '"],' END 
      WHEN t.name IN ('int') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as int?,' 
                 ELSE '(int)reader["' + c.name + '"],' END 
      WHEN t.name IN ('bit') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as bool?,' 
                 ELSE '(bool)reader["' + c.name + '"],' END 
      WHEN t.name IN ('bigint') THEN CASE 
                 WHEN c.Is_Nullable = 1 THEN 'reader["' + c.name + '"] as long?,' 
                 ELSE '(long)reader["' + c.name + '"],' END 
      WHEN t.name IN ('timestamp') THEN '(ulong)reader["' + c.name + '"],' 
      ELSE 'reader["' + c.name + '"] == DBNull.Value ? null : reader["' + c.name + '"],' END AS ReaderStatements 
FROM tempDb.sys.columns c 
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id AND t.system_type_id = t.user_type_id 
WHERE [object_id] = OBJECT_ID('tempdb..#Temp') 
ORDER BY column_id 

एक अधिक प्रेरित व्यक्ति प्रकारों के कुछ स्मार्ट मैपिंग को स्वचालित रूप से .NET समकक्षों को कर सकता है लेकिन यह इतना बुरा नहीं है और स्निपेट को छोटा रखता है।

इन प्रकारों को मैन्युअल रूप से परिवर्तित करने से स्क्रिप्ट को विस्तारित करने वाले बट में पर्याप्त दर्द था। सुनिश्चित नहीं है कि मेरे रूपांतरण सभी सही हैं।

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