动态SQL运行时列类型

时间:2015-05-21 11:53:27

标签: sql-server sql-server-2012

你们中的一些人可能认为我对存储过程做过最糟糕的事情,但这只是一次实验,这就是我正在做的事情,

CREATE procedure [dbo].[Flags_Update]
(
    @UserID nvarchar(255),
    @CategoryID INT,
    @ProductID INT,
    @PropertyName nvarchar(255),
    @PropertyValue nvarchar(max)
)
AS
DECLARE @sql nvarchar(500);
SET @sql = 'UPDATE Flags SET ' + @PropertyName + ' = ' + @PropertyValue + ' WHERE Flags Flags.CategoryID =' +  @CategoryID + ' AND Flags.ProductID ='+  @ProductID;
EXEC(@sql);
IF (@@ROWCOUNT=0)
    BEGIN
        SET @sql = 'INSERT INTO Flags(UserID, CategoryID, ProductID, '+ @PropertyName + ') VALUES(' + @UserID + ', ' + @CategoryID + ', ' + @ProductID + ', ' + @PropertyValue + ')';
        EXEC(@sql);
    END
GO

执行时我收到此错误,

  

转换nvarchar值'UPDATE Flags SET时转换失败   IsRelased = 1 WHERE Flags Flags.CategoryID ='to data type int。

我知道错误即将发生,因为当列类型为INT时,过程propertyName为nvarchar(255),如何克服此错误?

请注意,某些属性列将为nvarchar,而某些属性列为INT

修改

我做了一个聪明的事情,并决定让每个属性列都有nvarchar(255)作为数据类型,但我仍然收到此错误。

编辑2

按照马丁的建议进行施法,但现在收到此错误,

  

在上下文中指定的非布尔类型的表达式   条件预计,在'Flags'附近

1 个答案:

答案 0 :(得分:1)

这是因为SET @sql语句中的某些参数值为INT

尝试CAST CONVERT INTNVARCHAR字段到SET @sql = 'UPDATE Flags SET ' + @PropertyName + ' = ' + @PropertyValue + ' WHERE Flags Flags.CategoryID =' + CAST(@CategoryID AS NVARCHAR) + ' AND Flags.ProductID ='+ CAST(@ProductID AS NVARCHAR); s。您需要在连接文本和数字的代码中执行此操作。

+  @CategoryID +

请注意,我已将+ CAST(@CategoryID AS NVARCHAR) +更改为delegate,依此类推。