将 sql_variant 转换为以 varchar 形式提供的 data_type
Cast sql_variant into data_type provided as varchar
我有一个关注 sql table:
Types table
--------------------------------------
|Name(varchar(50))|Type (varchar(50))|
--------------------------------------
| Car | varchar(50) |
| Apples | int |
--------------------------------------
我正在使用另一个 tables 来存储值,例如:
Apples table:
----------------------------
|Value (providedType - int)|
----------------------------
|50 |
|60 |
----------------------------
要向这些 table 中插入值,我正在使用存储过程(其中的一部分):
CREATE PROCEDURE [dbo].[AddValue]
@value sql_variant
@name varchar(50)
@tableName (50)
AS
BEGIN
DECLARE @Sql NVARCHAR(MAX)
DECLARE @valueType VARCHAR(50)
SET @valueType = (SELECT [Type] FROM [dbo].[Types] WHERE [Name] = @name)
SET @Sql = N'INSERT INTO [dbo].'+ @tableName + N' VALUES(' + @value + N')'
EXECUTE sp_executesql @Sql
...
动态执行将抛出异常,即不允许隐式转换 sql_variant。有什么方法可以将 sql_variant 类型转换为作为 varchar 提供的类型?
如:
CONVERT(@valueType, @value)
@valueType 是 varchar 而不是 datetype
是的,您可以将 sql_variants
作为参数传递给 sp_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 像这样。
/*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
我有一个关注 sql table:
Types table
--------------------------------------
|Name(varchar(50))|Type (varchar(50))|
--------------------------------------
| Car | varchar(50) |
| Apples | int |
--------------------------------------
我正在使用另一个 tables 来存储值,例如:
Apples table:
----------------------------
|Value (providedType - int)|
----------------------------
|50 |
|60 |
----------------------------
要向这些 table 中插入值,我正在使用存储过程(其中的一部分):
CREATE PROCEDURE [dbo].[AddValue]
@value sql_variant
@name varchar(50)
@tableName (50)
AS
BEGIN
DECLARE @Sql NVARCHAR(MAX)
DECLARE @valueType VARCHAR(50)
SET @valueType = (SELECT [Type] FROM [dbo].[Types] WHERE [Name] = @name)
SET @Sql = N'INSERT INTO [dbo].'+ @tableName + N' VALUES(' + @value + N')'
EXECUTE sp_executesql @Sql
...
动态执行将抛出异常,即不允许隐式转换 sql_variant。有什么方法可以将 sql_variant 类型转换为作为 varchar 提供的类型? 如:
CONVERT(@valueType, @value)
@valueType 是 varchar 而不是 datetype
是的,您可以将 sql_variants
作为参数传递给 sp_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 像这样。
/*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