将sql_变量强制转换为作为varchar提供的数据_类型

将sql_变量强制转换为作为varchar提供的数据_类型,sql,sql-server,stored-procedures,casting,Sql,Sql Server,Stored Procedures,Casting,我有以下sql表: Types table -------------------------------------- |Name(varchar(50))|Type (varchar(50))| -------------------------------------- | Car | varchar(50) | | Apples | int | -------

我有以下sql表:

 Types table

    --------------------------------------
    |Name(varchar(50))|Type (varchar(50))|
    --------------------------------------
    | Car             | varchar(50)      |
    | Apples          | int              |
    --------------------------------------
我正在使用另一个表来存储值,例如:

Apples table:

    ----------------------------
    |Value (providedType - int)|
    ----------------------------
    |50                        |
    |60                        |
    ----------------------------
要在这些表中插入值,我使用存储过程(它的一部分):

Dynamic execute将引发一个异常,即不允许隐式转换sql_变量。有没有办法将sql_变量类型转换为作为varchar提供的类型? 例如:

CONVERT(@valueType, @value)

如果@valueType是varchar not datetype

是,您可以将
sql\u variants
作为参数传递给
sp\u executesql
,但您需要使用“Cast to”类型继续沿着动态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注入漏洞

/*将varchar转换为sql\u变量*/ --可变的 声明@in varchar(max)=“你好,世界” ,@out sql\u变量 --质疑 声明@query nvarchar(max)='SELECT@in='+char(39)+@in+char(39) EXEC sp_executesql@query, --宣布 N'@在sql_变量输出中' ---转移/转移 ,@in=@out输出 --表演/表演 选择@out
根据您的代码,您似乎正在使用sql server。但是,您已经标记了mysql。请标记适当的RDBMS,表列“Name”的默认大小是多少?您在哪里声明了变量@Sql???/@ArunprasanthKV请参阅更新的questionWorks很棒!谢谢我使用QUOTENAME作为表名和类型
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;  
/*Convert varchar to sql_variant*/ --variable / variaveis DECLARE @in varchar(max) = 'hello world' ,@out sql_variant --query declare @query nvarchar(max) = 'SELECT @in = '+char(39)+@in+char(39) EXEC sp_executesql @query, -- declare OUT(s) N'@in sql_variant OUTPUT' ---transfer / tranferir ,@in = @out OUTPUT --show / exibir SELECT @out