Soru SQL geçici tablosunun veri türlerini bulma


Bir işlevde kullanabilmem için #temp tablosunu @table değişkenine çevirmem gerekiyor.

Sorgum, #temp'e (birden çok tablodan) ekleme gibi kullanır:

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

#Temp tablosundaki sütunların veri türlerini bulmanın kolay bir yolu var, böylece #temp olarak aynı sütun ve veri türleriyle @table değişkeni oluşturabilir miyim?


44
2017-09-20 14:32


Menşei


@AaronBertrand haklı ama @gotqn gelen cevap hiçbiri için mükemmel temp tablolar. - Rafa Barragan


Cevaplar:


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

veya

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

99
2017-09-20 14:35



İkinci öneriyi beğendim ancak metin türlerini sağlamadı bu yüzden burada veri türleri ile birleştirildi. ´SELECT cols.column_id, cols.name, ty.name, cols.max_length, cols.precision, cols.scale FROM tempdb.sys.columns cols.system_type_id = ty.system_type_id üzerinde sys.types ty'e katın WHERE [object_id] = OBJECT_ID (N'tempdb .. # myTable ');' - RobbZ


bir karma tablosuyla ilgili ayrıntıları almak için tempdb veritabanından çalıştırmak için sp_help işlemine hak kazanmanız gerekir, çünkü hash tablosunun depolandığı yerdir. Sp_help'i farklı bir veritabanından çalıştırmaya çalışırsanız, tablonun bu veritabanında bulunmadığı konusunda bir hata alırsınız.

Sorgunuz tempdb dışında çalıştırılıyorsa, varsayalım, aşağıdakileri çalıştırabilirsiniz:

exec tempdb..sp_help #temp

Bu yordamın bir yararı, sizin için sütun veri türlerinin bir metin açıklamasını içerir. Bu, kopyalayıp başka bir sorguya yapıştırmayı çok kolaylaştırır, örn. Bir tablo değişkeni oluşturmak için geçici tablo tanımını kullanmaya çalışıyorsanız.

Aynı bilgiyi Syscolumns tablosunda bulabilirsin, fakat kendini haritalamak zorunda olduğun tipler için sayısal belirteçler verecek. Sp_help'i kullanmak size bir adım kazandıracak.


6
2018-06-01 13:54



Bunun için teşekkürler, kabul edilen cevaptan daha iyi bir yol çünkü aslında ne yapıldığını ve neden olduğunu açıklıyor. - underscore_d


Kabul edilen cevap veri türü vermez. Sys.types ile tempdb.sys.columns cevabın yorumunda belirtilen veri türünü verir. Ancak, system_type_id üzerinde katılarak veri türü "sysname" ile bir satır daha verir. Bunun yerine "user_type_id", aşağıda verilen kesin çözümü verir.

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





Ne yapmaya çalıştığınız, sorguladığınız sütunların sistem türleri hakkında bilgi almaktır.

İçin SQL Server 2012 and later kullanabilirsiniz sys.dm_exec_describe_first_result_set işlevi. Sütunlar ve hakkında çok ayrıntılı bilgi verir system_type_column tüm sistem tipi tanımını (tablo tanımınızda kullanıma hazır) tutar:

Örneğin:

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



Ben hata "meta verisi belirlenemedi çünkü deyim" SELECT * FROM tempdb.dbo. # T 'bir temp tablosu kullanır. " geçici tablolar için ... - blobbles
Sınırlamalar hakkında aşağıdaki makaleyi kontrol edin - msdn.microsoft.com/en-us/library/ff878258.aspx - bakın Remarks Bölüm. - gotqn


Evet, geçici tablonun veri türleri, seçtiğiniz ve eklediğiniz sütunların veri türleri olacaktır. Bu yüzden, select ifadesine bakın ve seçtiğiniz veri tabanına göre her veri tipini belirleyin.


2
2017-09-20 14:35



Teşekkürler - Bu şekilde yapabileceğinizin farkındayım, ancak özellikle çok büyük bir sıcaklık tablosu varsa, birden çok sütun ve tabloyu kontrol etmek için bir acıya dönüşüyor. - woggles
Gördüğüm @ gözlük. billinkc en lazy yaklaşım bu durumda daha iyi size uyar. - Icarus
şimdi sadece declare @ table deyimi komut dosyası için güzel tembel bir yol bulmaya ihtiyacım var :) - woggles
@woggles Bunun için tembel bir yaklaşım var mı bilmiyorum ama bu size sütun isimlerini, veri tiplerini ve her birinin uzunluğunu anlatacak bir sonuç kümesinde, SQL deyimini dinamik olarak oluştururken komut dosyasını oluşturabiliyorsunuz. 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, SQL Server'ın şu anki sürümlerinde bir acıdır (hassasiyeti ve ölçeği unutmayın, nvarchar için maks_length için koşullu şartlar, max_length değerini değiştirerek) MAX -1 ise, Denali'deki diğer türler, tablo türleri, CLR türleri ile başa çıkmak için meta veri bulma özelliklerini kullanmanın çok daha iyi bir yolu olacaktır: sqlblog.com/blogs/aaron_bertrand/archive/2010/12/20/... - Aaron Bertrand


Diğer cevaplar, ihtiyacınız olan bilgiyi size verir, ancak tablo değişkenini tanımladığınızda yine de hepsini yazmanızı gerektirir.

Aşağıdaki TSQL, herhangi bir tablo için tablo değişkeninin tanımını hızlı bir şekilde oluşturmanıza izin verecektir.

Bu, aşağıdaki gibi tablo tanımlarını elle yazmak yerine çok fazla zaman kazandırabilir:

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

Çıktı:

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

2
2017-11-17 18:31



Tam olarak bugün aradığım şey - Todd


Tembel rotaya gidip kullanayım

use tempdb
GO
EXECUTE sp_help #temp

1
2017-09-20 14:35





veri türü ile sütun adı almak için bunu kullanın

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

veya Bunu kullanmak için yalnızca sütun adı almak

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

0
2017-08-29 19:40