2012-05-24 36 views
4

比如我想做的事情是這樣的:獲取類型的列

//if the Column type is nvarchar 
//do something 

//if the Column type is int 
//do something 

編輯:

例如:

我有列的表(COL1是int,col2是nvarchar),並且我在此表中有數據,例如

col1 : 1,2,3,4,NULL and col2 : a,b,d,f,E,NULL 

現在我想填補COL1的NULL數據與「」 COL2的0和NULL數據

+1

在表中的列?一個參數? ...?你的IF聲明的背景是什麼?什麼是「做某事」?你爲什麼不知道你的列的數據類型? –

+0

是一列表,我想要做的:例如,如果列類型是int,我聲明一個int變量 – Arash

+0

但是你如何指定列名?這是一個作爲參數傳入的列名嗎?只是想了解上下文以及你想要做什麼。如前所述,這個問題對我來說毫無意義。 –

回答

15

如果你知道表和列名,則:

DECLARE @tn SYSNAME; 

SELECT @tn = TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = @column_name 
AND [object_id] = OBJECT_ID('dbo.tablename'); 

IF @tn = N'nvarchar' 
    DECLARE @x NVARCHAR(32); 

IF @tn = N'int' 
    DECLARE @i INT; 

但是請注意,你不會即使SQL Server只能訪問其中的一個,也可以用這種方式聲明相同的不同數據類型的變量名稱。你會得到這樣的:

消息134,15級,狀態1,4號線
變量名 '@i' 已經 被宣佈。變量名稱在查詢批處理或 存儲過程中必須是唯一的。

如果你知道表的名字,那麼你可以建立一個動態的SQL語句,像你這樣的建議如下(注意,這僅涉及INT,TINYINT,SMALLINT,BIGINT,CHAR,NCHAR,VARCHAR和NVARCHAR - 但應該給你的想法):

DECLARE @table NVARCHAR(512) = 'dbo.whatever'; 

DECLARE @sql NVARCHAR(MAX); 
SELECT @sql = N'SELECT '; 

SELECT @sql = @sql 
    + STUFF((SELECT ',' + QUOTENAME(c.name) + ' = COALESCE(' 
    + QUOTENAME(c.name) + ',' + CASE 
     WHEN t.name LIKE '%int' THEN '0' 
     WHEN t.name LIKE '%char' THEN ''' ''' 
     END + ')' 
FROM sys.types AS t 
INNER JOIN sys.columns AS c 
ON t.system_type_id = c.system_type_id 
AND t.user_type_id = c.user_type_id 
WHERE c.[object_id] = OBJECT_ID(@table) 
ORDER BY c.column_id 
FOR XML PATH('')), 1, 1, ''); 

SET @sql = @sql + ' FROM ' + @table; 
--SET @sql = @sql + ' WHERE...' 

EXEC sp_executesql @sql; 

我不知道你怎麼可以甚至夢想做到這一點沒有動態SQL。呃,這是很多工作來防止您的表示層不必處理NULL。這可能是處理這個問題的好地方。

+0

謝謝,我想填充空數據單元格(foreach表),如果類型的列是int,用0填充空單元格,如果它的nvarchar填充爲「」 – Arash

+0

「填充空單元格」...我們還在談論SQL Server嗎? –

+0

例如我有一個表與列(col1 int,col2 nvarchar),我有這個表中的數據,例如col1有1,2,3,4,NULL和COL2有a,b,d,f ,NULL,現在我想填充col1的NULL數據和col2的NULL數據以及「」,謝謝 – Arash

0

這是你在找什麼?

declare @columns as table 
(col1 int,col2 nvarchar) 

insert @columns 
values (1,'a'),(2,'b'),(3,'d'),(4,'f'),(null,null) 

select isnull(col1,0), isnull(col2,'') from @columns 
+0

除了傳入表名,所以他不知道查詢中的列將是什麼或它們是什麼數據類型。 –

-2
SELECT typ.name, c_name,CASE when system_type_id <> 243 then typ.max_length 
           when system_type_id = 243 then c_maxlen 
         END AS [Maxlen1] , 
         CASE when system_type_id <> 243 then typ.precision 
           when system_type_id = 243 then c_precision 
         END AS [precision] , 

         CASE when system_type_id <> 243 then typ.scale 
           when system_type_id = 243 then c_scale 
         END AS [scale] , 

         CASE when system_type_id <> 243 then typ.is_nullable 
           when system_type_id = 243 then c_nullability 
         END AS [nullabilty] , 
         CASE 
         WHEN system_type_id = 34 THEN 'image' 
      WHEN (system_type_id = 35 OR cid = 35) THEN 'text' 
      WHEN (system_type_id = 36 OR cid = 36) THEN 'uniqueidentifier' 
      WHEN (system_type_id = 40 OR cid = 40) THEN 'date' 
      WHEN (system_type_id = 41 OR cid = 41) THEN 'time' 
      WHEN (system_type_id = 42 OR cid = 42) THEN 'datetime2' 
      WHEN (system_type_id = 48 OR cid = 48) THEN 'tinyint' 
      WHEN (system_type_id = 52 OR cid = 52) THEN 'smallint' 
      WHEN (system_type_id = 56 OR cid = 56) THEN 'int' 
      WHEN (system_type_id = 58 OR cid = 58) THEN 'smalldatetime' 
      WHEN (system_type_id = 59 OR cid = 59) THEN 'real' 
      WHEN (system_type_id = 60 OR cid = 60) THEN 'money' 
      WHEN (system_type_id = 61 OR cid = 61) THEN 'datetime' 
      WHEN (system_type_id = 62 OR cid = 62) THEN 'float' 
      WHEN (system_type_id = 98 OR cid = 98) THEN 'sql_variant' 
      WHEN (system_type_id = 99 OR cid = 99) THEN 'ntext' 
      WHEN (system_type_id = 104 OR cid = 104) THEN 'bit' 
      WHEN (system_type_id = 106 OR cid = 106) THEN 'decimal' 
      WHEN (system_type_id = 108 OR cid = 108) THEN 'numeric' 
      WHEN (system_type_id = 122 OR cid = 122) THEN 'smallmoney' 
      WHEN (system_type_id = 127 OR cid = 127) THEN 'bigint' 
      WHEN (system_type_id = 165 OR cid = 165) THEN 'varbinary' 
      WHEN (system_type_id = 167 OR cid = 167) THEN 'varchar' 
      WHEN (system_type_id = 173 OR cid = 173) THEN 'binary' 
      WHEN (system_type_id = 175 OR cid = 175) THEN 'char' 
      WHEN (system_type_id = 189 OR cid = 189) THEN 'timestamp' 
      WHEN (system_type_id = 231 OR cid = 231) THEN 'nvarchar' 
      WHEN (system_type_id = 239 OR cid = 239) THEN 'nchar' 
      WHEN (system_type_id = 241 OR cid = 241) THEN 'xml' 
--    when (system_type_id = 243 OR cid = 243) THEN 'TABLE' 
     END AS [Type] 
    FROM sys.types as typ left outer join (select table_types.name tt_name, columns.name c_name ,columns.max_length c_maxlen ,columns.precision c_precision ,columns.scale c_scale,columns.is_nullable c_nullability ,columns.system_type_id cid 
              from sys.table_types , sys.columns 
              where columns.object_id = table_types.type_table_object_id) tt 
on (typ.name = tt.tt_name)       
where typ.is_user_defined = 1