gpt4 book ai didi

sql - 将 sql_variant 转换为以 varchar 形式提供的 data_type

转载 作者:行者123 更新时间:2023-12-03 21:39:55 26 4
gpt4 key购买 nike

我有一个如下的sql表:

 Types table

--------------------------------------
|Name(varchar(50))|Type (varchar(50))|
--------------------------------------
| Car | varchar(50) |
| Apples | int |
--------------------------------------

我正在使用另一个表来存储值,例如:

Apples table:

----------------------------
|Value (providedType - int)|
----------------------------
|50 |
|60 |
----------------------------

为了将值插入到这些表中,我使用了一个存储过程(其中的一部分):

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;

不用说,您需要确保您的@tableNameType 数据需要针对白名单运行,以防止 Sql 注入(inject)像这样的动态 SQL 的漏洞。

SqlFiddle here

关于sql - 将 sql_variant 转换为以 varchar 形式提供的 data_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30591032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com