Convertit sql_variant en type_données fourni en tant que varchar

J'ai une table sql suivante:

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

J'utilise d'autres tables pour stocker des valeurs telles que:

 Apples table: ---------------------------- |Value (providedType - int)| ---------------------------- |50 | |60 | ---------------------------- 

Pour insert des valeurs dans ces tables j'utilise une procédure stockée (une partie de celle-ci):

 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 ... 

L'exécution dynamic lèvera une exception que la dissortingbution implicite de sql_variant n'est pas autorisée. Est-il possible de convertir le type sql_variant dans le type fourni en tant que varchar? Tel que:

 CONVERT(@valueType, @value) 

Où @valueType est varchar pas datetype

Oui, vous pouvez passer sql_variants tant que parameters de sp_executesql , mais vous devez continuer à suivre la route SQL dynamic avec le type "Transmettre vers" et utiliser le nom du type que vous avez déterminé pour la colonne à utiliser dans un CAST .

Prenez ceci par exemple:

 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; 

Inutile de dire que vous devrez vous assurer que vos données @tableName et Type doivent être exécutées sur une list blanche, afin de se protéger contre les vulnérabilités de Sql Injection avec un Sql dynamic comme celui-ci.

SqlFiddle ici