2015-09-15 3 views
1

хранимая процедура:SQL Server хранимые процедуры компиляции ошибка

CREATE PROCEDURE CountUtily 
    @domain varchar(50), 
    @count int, 
    @totalCount int OUT 
AS 
BEGIN 
    SET NOCOUNT ON 
    SET @totalCount=0 

    IF (EXISTS (SELECT @totalCount = count 
       FROM FormFillerAuto2_DomainCount 
       WHERE domain = @domain)) 
    BEGIN 
     SET @totalCount = @totalCount + @count 

     UPDATE FormFillerAuto2_DomainCount 
     SET count = @totalCount 
     WHERE domain = @domain 
    END 
    ELSE 
    BEGIN 
     INSERT INTO FormFillerAuto2_DomainCount (domain, count) 
     VALUES (@domain, @count) 
    END 
END 

Ошибка:

Incorrect syntax near '='. Incorrect syntax near the keyword 'ELSE'.

+0

@Ajmot, это синтаксис 'MySQL'. В 'SQL Server' нет предложения' FROM' в 'UPDATE'. – Rahul

+0

Я не думаю, что вы можете выбрать @totalCount = count в функции Exists. Проверьте это http://stackoverflow.com/questions/8598740/assigning-a-variable-inside-an-if-exists-clause – PeonProgrammer

+0

@Rahul да, я испортил. моя вина. :) –

ответ

1

См EXISTS

Specifies a subquery to test for the existence of rows. it Returns TRUE if a subquery contains any rows,it accept restricted SELECT statement , The INTO keyword is not allowed.

the problem here is you can't set the value inside the Exists.

Попробуйте

alter PROCEDURE CountUtily 
    @domain varchar(50), 
    @count int, 
    @totalCount int OUT 
AS BEGIN  
    SET NOCOUNT ON 
    SET @totalCount=0; 

    IF (EXISTS (SELECT [count] FROM FormFillerAuto2_DomainCount WHERE [email protected])) 
    begin 
     SELECT @totalCount=[count] FROM FormFillerAuto2_DomainCount WHERE [email protected] 
     UPDATE FormFillerAuto2_DomainCount SET [email protected] WHERE [email protected] 
    end 
    ELSE 
    begin 
     INSERT INTO FormFillerAuto2_DomainCount (domain, count) VALUES (@domain, @count) 
    end 
end 
0

Я считаю, что вам не хватает ;, чтобы отметить конец заявления здесь. Опять же, count является резервным словом, поэтому избегайте его, используя []. Ваша опубликованная процедура может быть изменена до

CREATE PROCEDURE CountUtily(
    @domain varchar(50), 
    @count int, 
    @totalCount int OUT) 
AS BEGIN  
    SET NOCOUNT ON; 
    SET @totalCount=0; 
    SELECT @totalCount=[count] FROM FormFillerAuto2_DomainCount WHERE [email protected]; 
    IF (@totalCount IS NOT NULL) 
    begin 
     SET @[email protected][email protected]; 
     UPDATE FormFillerAuto2_DomainCount SET [count][email protected] WHERE [email protected]; 
    end 
    ELSE 
     INSERT INTO FormFillerAuto2_DomainCount (domain, [count]) VALUES (@domain, @count); 
end 
+0

Извините, все еще получаю ту же ошибку – Arnab

+0

@ Арнаб, быть не может. Проверьте отредактированный ответ. – Rahul

+0

Собрать. Но когда я выполняю код C#, INSERT не работает. Он не вставляет ни одной строки, но также не возвращает никакой ошибки. – Arnab

2

Ваш Select @totalCount = count не возвращает bool. Попробуйте установить @totalCount перед, если оценивает и Eval счетчик в

если
CREATE PROCEDURE CountUtily 
@domain varchar(50), 
@count int, 
@totalCount int OUT 
AS BEGIN  
SET NOCOUNT ON 
SET @totalCount=0 

SELECT @totalCount=count FROM FormFillerAuto2_DomainCount WHERE 

IF (@totalCount > 0) 
begin 
    SET @[email protected][email protected] 
    UPDATE FormFillerAuto2_DomainCount SET [email protected] WHERE [email protected] 
end 
ELSE 
begin 
    INSERT INTO FormFillerAuto2_DomainCount (domain, count) VALUES (@domain, @count) 
end 
end 
+0

Проблема @totalCount может быть> = 0 .. Я не могу ее использовать, если .. что мне делать? – Arnab

+0

Я не могу следить за тем, что вы пытаетесь сделать с помощью своего оригинального оператора exist(). Вы хотите использовать «@@ ROWCOUNT»? –

+0

Да, 'if exists()' была основной проблемой здесь, которая принимает только «ограниченный подзапрос». –

0

Вы сделали этот запрос слишком сложный с графом и итоговые переменные; все из которых вам не нужны.

Итак, вы хотите обновить поле «count» вашего «FormFillerAuto2_DomainCount», когда поле «domain» соответствует параметру @domain; или вы хотите вставить его, если он не существует.

Хорошо, давайте сделаем это с помощью @@ RowCount.

UPDATE FormFillerAuto2_DomainCount SET [count] = ([count][email protected]) where [domain] = @domain 
If (@@ROWCOUNT > 0) 
BEGIN 
    return 1 --updated : or return whatever you need to show it updated 
END 
ELSE 
BEGIN 
    INSERT INTO FormFillerAuto2_DomainCount ([domain], [count]) VALUES (@domain, @count) 
    return 2 --inserted : or return whatever you need to show it inserted 
END 
0

Похоже, ваше обновление немного задрать .. Это должно быть UPDATE TABLENAME SET ColumnName = VALUE ГДЕ УСЛОВИЕ

читаемость поможет понять и поддерживать код.

Смежные вопросы