Sql server 获取SQL Server中的列类型

Sql server 获取SQL Server中的列类型,sql-server,types,Sql Server,Types,例如,我想做这样的事情: //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 现在我想用0填充col1的NULL数据,用“”填充col2的NULL数据。如果您知道

例如,我想做这样的事情:

//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

现在我想用0填充col1的NULL数据,用“”填充col2的NULL数据。

如果您知道表和列名,那么:

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只能访问其中一种类型。您将得到如下结果:

Msg 134,级别15,状态1,第4行
变量名'@i'已经存在 已经宣布。变量名在查询批处理中必须是唯一的,或者 存储过程

如果您知道表的名称,那么您可以构建一个动态SQL语句,如下所示(请注意,这只包括INT、TINYINT、SMALLINT、BIGINT、CHAR、NCHAR、VARCHAR和NVARCHAR,但应该让您知道):


我不知道如果没有动态SQL,你怎么会梦想这样做。呃,为了防止您的表示层不得不处理空值,需要做大量的工作。这可能是更好的解决方法。

这就是你想要的吗

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
选择typ.name、c_name、CASE when system_type_id 243,然后选择typ.max_length
当system_type_id=243时,则c_maxlen
以[Maxlen1]结尾,
当系统类型id为243时,则为典型精度
当系统类型id=243时,则c_精度
结束为[精度],
当系统类型id为243时,则为典型刻度
当系统类型id=243时,则c\U比例
以[比例]结束,
当系统类型id为243时,则类型可为空
当系统类型id=243时,则c_为空
终止为[无效],
案例
当系统类型id=34时,则为“图像”
当(系统类型id=35或cid=35)时,则为“文本”
当(系统类型id=36或cid=36)时,则为“唯一标识符”
当(系统类型id=40或cid=40)时,则为“日期”
当(系统类型id=41或cid=41)时,则为“时间”
当(系统类型id=42或cid=42)时,则为“datetime2”
当(系统类型id=48或cid=48)时,则“tinyint”
当(系统类型id=52或cid=52)时,则为“smallint”
当(系统类型id=56或cid=56)时,则为“int”
当(系统类型id=58或cid=58)时,则为“smalldatetime”
当(系统类型id=59或cid=59)时,则为“真实”
当(系统类型id=60或cid=60)时,则为“金钱”
当(系统类型id=61或cid=61)时,则为“日期时间”
当(系统类型id=62或cid=62)时,则为“浮动”
当(系统类型id=98或cid=98)时,则为“sql变量”
当(系统类型id=99或cid=99)时,则为“ntext”
当(系统类型id=104或cid=104)时,则为“位”
当(系统类型id=106或cid=106)时,则为“十进制”
当(系统类型id=108或cid=108)时,则为“数值”
当(系统类型id=122或cid=122)时,则为“小额货币”
当(系统类型id=127或cid=127)时,则为“bigint”
当(系统类型id=165或cid=165)时,则为“varbinary”
当(系统类型id=167或cid=167)时,则为“varchar”
当(系统类型id=173或cid=173)时,则为“二进制”
当(系统类型id=175或cid=175)时,则为“字符”
当(系统类型id=189或cid=189)时,则为“时间戳”
当(系统类型id=231或cid=231)时,则为“nvarchar”
当(系统类型id=239或cid=239)时,则为“nchar”
当(系统类型id=241或cid=241)时,则为“xml”
--当(系统类型id=243或cid=243)时,则为“表”
结束为[类型]
从sys.types as typ left outer join(选择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
从sys.table_类型,sys.columns
其中columns.object\u id=table\u types.type\u table\u object\u id)tt
on(典型名称=tt.tt\U名称)
其中,typ.is_user_defined=1

表格中的一列?参数。。。?你的IF语句的上下文是什么?什么是“做点什么”?为什么您不知道列的数据类型呢?是的,对于表中的一列,我想这样做:例如,如果列类型为int,我声明一个int变量,但是如何指定列名?这是作为参数传入的列名吗?只是试着理解上下文和你想做什么。如上所述,这个问题对我来说没有什么意义。列名和类型是在SSMS表的设计模式中指定的,是的,这是一个输入参数。我在回答中已经说明了这一点,我认为如果您想要更好的帮助,您需要告诉我们您实际上在尝试做什么,而不是询问如何根据列类型进行分支。这将导致更多的问题,而不是答案。谢谢,我想填充数据的空单元格(foreach表),如果列的类型是int,则用0填充空单元格,如果是nvarchar,则用“”填充空单元格“。。。我们还在这里谈论SQL Server吗?例如,我有一个列的表(int中的col1,nvarchar中的col2),我在这个表中有数据,例如col1有1,2,3,4,NULL,col2有a,b,d,f,NULL,现在我想用0填充col1的NULL数据,用“”,填充col2的NULL数据,thanks@arash请在您的问题中说明您的实际要求
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
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