将sql_变量强制转换为作为varchar提供的数据_类型
我有以下sql表:将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 | -------
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