如果您知道表和列名,那么:
DECLARE @tn sysname;
SELECT @tn = TYPE_NAME(system_type_id)
FROM sys.columns
WHERE name = @column_name
AND [object_id] = OBJECT_ID(N'dbo.tablename');
IF @tn = N'nvarchar'
DECLARE @x nvarchar(32);
IF @tn = N'int'
DECLARE @i int;
但是请注意,您将无法以这种方式声明具有不同数据类型的相同变量名,即使 SQL Server 只能访问其中一个。你会得到类似的东西:
消息 134,级别 15,状态 1
变量名称“@i”已被声明。变量名称在查询批处理或存储过程中必须是唯一的。
如果您知道表的名称,那么您可以构建一个动态 SQL 语句,如下所示(请注意,这仅涵盖类型的子集 - 但应该给您这个想法):
DECLARE @table nvarchar(512) = N'dbo.whatever';
DECLARE @sql nvarchar(max) = N'SELECT ';
SELECT @sql = @sql
+ STUFF((SELECT N',' + QUOTENAME(c.name) + N' = COALESCE('
+ QUOTENAME(c.name) + N',' + CASE
WHEN t.name LIKE N'%int' THEN N'0'
WHEN t.name LIKE N'%char' THEN N''' '''
END + N')'
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(''),
TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'');
SET @sql = @sql + N' FROM ' + @table;
--SET @sql = @sql + N' WHERE...'
EXEC sys.sp_executesql @sql;
我不知道如果没有动态 SQL,你怎么会梦想这样做。而且,为了防止您的表示层不得不处理 NULL,这需要做很多工作。那可能是处理这个问题的更好地方。