如果您知道表格和列名,那么:
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;
然而请注意, 您将无法以这种方式声明数据类型不同的 < em> same em > 变量名称, 即使 SQL 服务器只达到其中之一 。 您将会得到类似 :
Msg 134, Level 15, State 1
The variable name @i has already
been declared. Variable names must be unique within a query batch or
stored procedure.
如果您知道表格的名称,您可以按照以下提议建立一个动态 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的情况下做这个。 和Ugh, 做很多工作来防止你的演示级别不得不处理NULLs。 这可能是处理这件事的最好地方。