获取SQL Server中的列类型

Ara*_*ash 4 sql-server types

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

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

//if the Column type is int
//do something
Run Code Online (Sandbox Code Playgroud)

编辑:

例如 :

我有一个包含列的表(col1是int,col2是nvarchar),我有这个表中的数据,例如

col1 : 1,2,3,4,NULL and col2 : a,b,d,f,E,NULL
Run Code Online (Sandbox Code Playgroud)

现在我想用0填充col1的NULL数据,用cols填充col2的NULL数据

Aar*_*and 16

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

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;
Run Code Online (Sandbox Code Playgroud)

但请注意,您将无法以这种方式使用不同的数据类型声明相同的变量名称,即使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;
Run Code Online (Sandbox Code Playgroud)

我不知道如果没有动态SQL,你甚至可以做到这一点.嗯,这是防止你的表示层必须处理NULL的很多工作.这可能是处理这个问题的更好的地方.