सवाल एक एसक्यूएल अस्थायी तालिका के डेटा प्रकार ढूँढना


मुझे #temp तालिका का उपयोग करके @table चर पर स्विच करने की आवश्यकता है ताकि मैं इसे किसी फ़ंक्शन में उपयोग कर सकूं।

मेरी क्वेरी #temp (एकाधिक तालिकाओं से) में डालने का उपयोग करती है जैसे:

SELECT 
  a.col1, 
  a.col2, 
  b.col1... 
INTO #temp
FROM ...

क्या #temp तालिका में कॉलम के डेटा प्रकारों को खोजने का कोई आसान तरीका है ताकि मैं @table चर के समान @ कॉलम वैरिएबल को उसी कॉलम और डेटा प्रकारों के साथ #temp के रूप में बना सकूं?


44
2017-09-20 14:32


मूल


@AaronBertrand सही है लेकिन @gotqn का उत्तर किसी के लिए उत्कृष्ट नहीं है temp टेबल। - Rafa Barragan


जवाब:


EXEC tempdb.dbo.sp_help N'#temp';

या

SELECT * 
    FROM tempdb.sys.columns 
    WHERE [object_id] = OBJECT_ID(N'tempdb..#temp');

99
2017-09-20 14:35



मुझे दूसरा सुझाव पसंद आया लेकिन यह पाठ में प्रकार प्रदान नहीं करता है, इसलिए यह डेटा प्रकारों के साथ जुड़ गया है। 'SELECT cols.column_id, cols.name, ty.name, cols.max_length, cols.precision, cols.scale tempdb.sys.columns cols से cols.system_type_id = ty.system_type_id पर sys.types ty में शामिल होते हैं [object_id] = object_id (N'tempdb .. # mytable ');' - RobbZ


हैश टेबल के बारे में विवरण प्राप्त करने के लिए आपको tempdb डेटाबेस से चलाने के लिए sp_help प्रक्रिया को अर्हता प्राप्त करने की आवश्यकता है, क्योंकि वह है जहां हैश तालिका वास्तव में संग्रहीत होती है। यदि आप किसी भिन्न डेटाबेस से sp_help चलाने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी कि तालिका उस डेटाबेस में मौजूद नहीं है।

यदि आपकी क्वेरी tempdb के बाहर निष्पादित हो रही है, जैसा कि मुझे लगता है कि, आप निम्न को चला सकते हैं:

exec tempdb..sp_help #temp

इस प्रक्रिया का एक लाभ यह है कि इसमें आपके लिए कॉलम डेटाटाइप का एक टेक्स्ट विवरण शामिल है। इससे किसी अन्य क्वेरी में कॉपी और पेस्ट करना बहुत आसान हो जाता है, उदा। यदि आप तालिका चर बनाने के लिए एक temp तालिका की परिभाषा का उपयोग करने का प्रयास कर रहे हैं।

आप Syscolumns तालिका में एक ही जानकारी पा सकते हैं, लेकिन यह आपको उन प्रकारों के लिए संख्यात्मक इंडेंटिफायर देगा जो आपको स्वयं को मैप करना होगा। Sp_help का उपयोग करके आप एक कदम बचाएंगे।


6
2018-06-01 13:54



इसके लिए धन्यवाद, स्वीकार किए गए उत्तर से बेहतर तरीका क्योंकि यह वास्तव में बताता है कि क्या किया जा रहा है और क्यों। - underscore_d


स्वीकार्य उत्तर डेटा प्रकार नहीं देता है। Sys.types के साथ tempdb.sys.columns को जोड़ने से उत्तर की टिप्पणी में उल्लिखित डेटा प्रकार मिलता है। लेकिन system_type_id पर शामिल होने से डेटाटाइप "sysname" के साथ एक अतिरिक्त पंक्ति उत्पन्न होती है। इसके बजाय "user_type_id" नीचे दिया गया सटीक समाधान देता है।

SELECT cols.NAME
 ,ty.NAME
FROM tempdb.sys.columns cols
JOIN sys.types ty ON cols.user_type_id = ty.user_type_id
WHERE object_id = OBJECT_ID('tempdb..#temp')

6
2017-07-28 10:57





आप जो करने का प्रयास कर रहे हैं वह उन कॉलम के सिस्टम प्रकारों के बारे में जानकारी प्राप्त करना है जिन्हें आप पूछ रहे हैं।

के लिये SQL Server 2012 and later आप उपयोग कर सकते हैं sys.dm_exec_describe_first_result_set समारोह। यह कॉलम और के बारे में बहुत विस्तृत जानकारी देता है system_type_column पूरी प्रणाली प्रकार परिभाषा रखती है (आपकी तालिका परिभाषा में उपयोग करने के लिए तैयार):

उदाहरण के लिए:

SELECT * 
FROM [sys].[dm_exec_describe_first_result_set] (N'SELECT object_id, name, type_desc FROM sys.indexes', null, 0);

enter image description here


3
2017-10-30 07:28



मुझे त्रुटि मिलती है "मेटाडाटा को निर्धारित नहीं किया जा सका क्योंकि स्टेटमेंट 'चुनें * tempdb.dbo से। # टी' एक temp तालिका का उपयोग करता है।" अस्थायी तालिकाओं के लिए ... - blobbles
सीमाओं के बारे में निम्नलिखित लेख देखें - msdn.microsoft.com/en-us/library/ff878258.aspx - देखें Remarks अनुभाग। - gotqn


हां, अस्थायी तालिका का डेटा प्रकार आपके द्वारा चुने गए कॉलम के डेटा प्रकार और इसमें डालने वाला होगा। तो बस चयन कथन देखें और आपके द्वारा चुने गए कॉलम के आधार पर प्रत्येक डेटा प्रकार निर्धारित करें।


2
2017-09-20 14:35



धन्यवाद - मुझे एहसास है कि आप इसे इस तरह से कर सकते हैं लेकिन यह कई स्तंभों और तालिकाओं को जांचने में दर्द होता है, खासकर यदि यह एक विशाल अस्थायी तालिका है। - woggles
@ woggles मैं देखता हूँ। billinkc के lazy दृष्टिकोण उस मामले में आपको बेहतर बनाता है। - Icarus
अब मुझे @ टेबल स्टेटमेंट घोषित करने के लिए सिर्फ आलसी तरीके खोजने की ज़रूरत है :) - woggles
@ woggles मुझे नहीं पता कि इसके लिए आलसी दृष्टिकोण है या नहीं, लेकिन यह आपको कॉलम नाम, डेटा प्रकार और प्रत्येक की लंबाई बताएगा, जिसके परिणामस्वरूप आप इसे फिर से चालू कर सकते हैं और स्क्रिप्ट को स्वचालित रूप से SQL कथन बना सकते हैं। SELECT sc.name,st.name as type_name ,sc.max_length FROM tempdb.sys.columns sc inner join sys.types st on st.system_type_id=sc.system_type_id WHERE [object_id] = OBJECT_ID('tempdb..#temp'); - Icarus
@woggles यह एसक्यूएल सर्वर के मौजूदा संस्करणों में दर्द है (परिशुद्धता और पैमाने के बारे में मत भूलना, nvarchar के लिए max_length halving के लिए सशर्त, max_length बदलना MAX यदि यह -1 है, तो उपनाम प्रकार, टेबल प्रकार, सीएलआर प्रकारों से निपटना) ... डेनाली में मेटाडाटा खोज सुविधाओं का उपयोग करके एक बेहतर तरीका होगा: sqlblog.com/blogs/aaron_bertrand/archive/2010/12/20/... - Aaron Bertrand


अन्य उत्तरों आपको वह जानकारी देंगे जो आपको चाहिए, लेकिन जब भी आप तालिका चर परिभाषित करते हैं, तब भी आपको इसे टाइप करने की आवश्यकता होती है।

निम्नलिखित TSQL आपको किसी दिए गए तालिका के लिए तालिका चर की परिभाषा को त्वरित रूप से उत्पन्न करने की अनुमति देगा।

यह तालिका परिभाषाओं को मैन्युअल रूप से टाइप करने की बजाय आपको बहुत समय बचा सकता है जैसे:

table(Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int
, Field4Name numeric(28,12))

TSQL:

select top 10 * 
into #temp
from db.dbo.myTable



declare @tableName nvarchar(max)
set @tableName = '#temp'

use tempdb
declare @tmp table(val nvarchar(max))
insert into @tmp 
select case data_type   
    when 'binary' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')'
    when 'char' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')'
    when 'datetime2' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + CAST(DATETIME_PRECISION as nvarchar(max)) + ')'
    when 'datetimeoffset' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + CAST(DATETIME_PRECISION as nvarchar(max)) + ')'
    when 'decimal' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(NUMERIC_PRECISION as nvarchar(max)) + ',' + cast(NUMERIC_SCALE as nvarchar(max)) + ')'
    when 'nchar' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')'
    when 'numeric' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(NUMERIC_PRECISION as nvarchar(max)) + ',' + cast(NUMERIC_SCALE as nvarchar(max)) + ')'
    when 'nvarchar' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')'
    when 'time' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + CAST(DATETIME_PRECISION as nvarchar(max)) + ')'
    when 'varbinary' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')'
    when 'varchar' then COLUMN_NAME + ' ' + DATA_TYPE + '(' + cast(CHARACTER_MAXIMUM_LENGTH AS nvarchar(max)) + ')'
    -- Most standard data types follow the pattern in the other section.  
    -- Non-standard datatypes include: binary, char, datetime2, datetimeoffset, decimal, nvchar, numeric, nvarchar, time, varbinary, and varchar
    else COLUMN_NAME + ' ' + DATA_TYPE

    end +  case when IS_NULLABLE <> 'YES' then ' NOT NULL' else '' end 'dataType'
     from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME like @tableName + '%'

declare @result nvarchar(max)
set @result = ''
select @result = @result + [val] + N','
from @tmp
where val is not null

set @result = substring(@result, 1, (LEN(@result)-1))

-- The following will replce '-1' with 'max' in order to properly handle nvarchar(max) columns
set @result = REPLACE(@result, '-1', 'max')
select @result

आउटपुट:

Field1Name nvarchar(4), Field2Name nvarchar(20), Field3Name int
, Field4Name numeric(28,12)

2
2017-11-17 18:31



वास्तव में जो मैं आज खोज रहा था - Todd


मैं आलसी मार्ग और उपयोग करेंगे

use tempdb
GO
EXECUTE sp_help #temp

1
2017-09-20 14:35