你们中的一些人可能认为我对存储过程做过最糟糕的事情,但这只是一次实验,这就是我正在做的事情,
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。
请注意,某些属性列将为nvarchar,而某些属性列为INT
修改
我做了一个聪明的事情,并决定让每个属性列都有nvarchar(255)
作为数据类型,但我仍然收到此错误。
编辑2
按照马丁的建议进行施法,但现在收到此错误,
在上下文中指定的非布尔类型的表达式 条件预计,在'Flags'附近
答案 0 :(得分:1)
这是因为SET @sql
语句中的某些参数值为INT
。
尝试CAST
CONVERT
INT
个NVARCHAR
字段到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
,依此类推。