我有一个如下的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
,但您需要继续使用“转换为”类型的动态 SQL 路径,并使用您为要在 a 中使用的列确定的类型名称。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
and Type
数据需要针对白名单运行,以防止使用像这样的动态 Sql 的 Sql 注入漏洞。
这里是 SqlFiddle http://sqlfiddle.com/#!6/58c10/1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)