Sql 合并时指定的非布尔类型的表达式?
我有以下代码来创建存储过程,但在这一行下面我似乎遇到了很多错误:Sql 合并时指定的非布尔类型的表达式?,sql,sql-server,Sql,Sql Server,我有以下代码来创建存储过程,但在这一行下面我似乎遇到了很多错误: ON (Target.Email = Source.Email AND Target.PromoName = Source.PromoName) 此行的错误是“指定了非布尔类型的表达式”。 我做错了什么 CREATE PROCEDURE [dbo].InsertUpdateBasicPromoEntry @Email nvarchar(100) ,@PromoName varchar(100) ,@Max
ON (Target.Email = Source.Email AND Target.PromoName = Source.PromoName)
此行的错误是“指定了非布尔类型的表达式”。
我做错了什么
CREATE PROCEDURE [dbo].InsertUpdateBasicPromoEntry
@Email nvarchar(100)
,@PromoName varchar(100)
,@MaxEntries tinyint
AS
BEGIN
SET NOCOUNT ON;
MERGE [dbo].[BasicCodePromoEntries] AS Target
USING (
SELECT
@Email as Email
,@PromoName as PromoName
) AS Source
ON (Target.Email = Source.Email AND Target.PromoName = Source.PromoName)
WHEN MATCHED
THEN
BEGIN
IF Target.PeriodExpires < GETDATE()
BEGIN
UPDATE SET
Target.PeriodExpires = GETDATE()
,Target.PeriodEntries = 1
END
ELSE IF Target.PeriodExpires > GETDATE() AND Target.PeriodEntries < @MaxEntries
BEGIN
UPDATE SET
Target.PeriodEntries = Target.PeriodEntries + 1
END
ELSE
BEGIN
RETURN 1
END
RETURN 0
END
WHEN NOT MATCHED BY Target
THEN
BEGIN
INSERT INTO Target (Email, PromoName, PeriodEntries, PeriodExpires) VALUES (@Email, @PromoName, 1, DATEADD(day, 1, GETDATE()))
RETURN 0
END
END
CREATE PROCEDURE[dbo].InsertUpdateBasicPromotion
@电子邮件nvarchar(100)
,@PromoName varchar(100)
,@MaxEntries tinyint
像
开始
不计数;
合并[dbo].[BasicCodePromoEntries]作为目标
使用(
选择
@电子邮件作为电子邮件
,@PromoName作为PromoName
)作为来源
打开(Target.Email=Source.Email和Target.PromoName=Source.PromoName)
匹配时
然后
开始
如果Target.period过期GETDATE()和Target.PeriodEntries<@MaxEntries
开始
更新集
Target.PeriodEntries=Target.PeriodEntries+1
终止
其他的
开始
返回1
终止
返回0
终止
当目标不匹配时
然后
开始
在目标(电子邮件、PromName、PeriodEntries、PeriodExpires)中插入值(@Email、@PromName、1、DATEADD(day、1、GETDATE()))
返回0
终止
终止
PS:每个开始和结束都有下划线,表示,…附近的语法不正确。我认为您不能使用
IF..ELSE
还有,DATETIME()
函数在SQL Server Woops混合语言中不存在,但是为什么我不能在这里使用IF-ELSE呢?我认为您需要重写,以便在每个合并条件之后只进行一次更新/插入,并使用列值的case语句控制更新的内容。语法如下: