Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并时指定的非布尔类型的表达式?_Sql_Sql Server - Fatal编程技术网

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语句控制更新的内容。语法如下: