2015-06-02 14 views
2

我有以下SQL表:角色SQL_VARIANT成DATA_TYPE爲varchar提供

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

動態執行會拋出一個異常,隱式ca不允許使用sql_variant。有什麼辦法可以將sql_variant類型轉換爲作爲varchar提供的類型嗎? 如:

CONVERT(@valueType, @value) 

哪裏@ValueType爲varchar不datetype

+1

根據你的代碼,它看起來像你使用的是sql-server。但是你已經標記了mysql。請標記適當的rdbms – ughai

+0

表格列「Name」的默認大小是多少?你在哪裏聲明變量@Sql ???/ –

+0

@ArunprasanthKV查看更新後的問題 –

回答

1

是的,你可以通過sql_variants作爲參數傳遞給sp_executesql,但你需要繼續向下動態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注入漏洞與像這樣的動態Sql。

SqlFiddle here

+2

非常棒!謝謝!我也使用QUOTENAME表名和類型 –