例如,我想做这样的事情:
//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的很多工作.这可能是处理这个问题的更好的地方.
| 归档时间: |
|
| 查看次数: |
22605 次 |
| 最近记录: |