是的,您可以将sql_variants
参数作为传递给sp_executesql
,但是您需要使用“转换为”类型继续沿动态sql路由进行下去,并使用为所使用的列确定的类型名称CAST
。
以这个为例:
CREATE TABLE Foo
(
ID INT
);
declare @type NVARCHAR(20) = N'INT'; -- Substitute your Type here.
declare @tableName NVARCHAR(50) = 'Foo';
declare @value sql_variant;
set @value = 1234;
DECLARE @sql AS NVARCHAR(MAX) = N'INSERT INTO [dbo].'+ @tableName +
N' VALUES(CAST(@value AS ' + @type + '))';
EXECUTE sp_executesql @sql, N'@value sql_variant', @value = @value;
不用说,您将需要确保您的@tableName
和Type
数据需要针对白名单运行,以便使用这种动态sql来防止sql Injection漏洞。