2013-10-13 2 views
-1

Пожалуйста, обратите внимание на следующем хранимой процедуры:Не могли бы вы рассказать мне, почему мой сохраненный proc не показывает никаких сообщений?

ALTER PROCEDURE [dbo].[SP_GetList] 
          @fname nvarchar(50), 
          @lname nvarchar(50), 
          @dob nvarchar(50), 
          @txtGroup varchar(50), 
          @Msg VARCHAR(1000) OUT 

AS 
SET NOCOUNT ON; 
-- added to prevent extra result sets from interfering with SELECT statements. 

IF exists(SELECT 'AKRON' AS CodeName, a.voter_id AS voter_id_vre, a.cnty_Group, a.district_combo, a.voter_fname, a.voter_mname, a.voter_lname, a.voter_suffix, COALESCE(a.str_number,'')+' '+COALESCE(a.str_name,'')+' '+COALESCE(a.str_suffix,'')+' '+COALESCE(a.str_apt,'') AS res_addr, 
       a.str_city, 'OH' AS str_state, a.str_zip, COALESCE(a.mail_str_num,'')+' '+COALESCE(a.mail_str_name,'')+' '+COALESCE(a.mail_srt_suff,'')+' '+COALESCE(a.mail_apt,'')+' '+COALESCE(a.mail_city,'')+' '+COALESCE(a.mail_state,'')+' '+COALESCE(a.mail_zip,'') AS mail_address, a.dob, (SELECT COUNT(*) FROM dbo.voter_record_supp WHERE dbo.voter_record_supp.voter_ID = a.voter_ID) AS [exists], b.* FROM dbo.voter_record a LEFT OUTER JOIN dbo.voter_record_supp b ON a.voter_id=b.voter_id 
       WHERE a.voter_fname Like '%fname%' And a.voter_lname Like '%@lname%' And a.dob = @dob 
       AND voter_status IN ('A','I') AND cnty_Group NOT LIKE 'ML%' AND cnty_Group NOT LIKE 'PA%' AND cnty_Group NOT LIKE 'MP%' AND cnty_Group NOT LIKE 'CH%' AND cnty_Group NOT LIKE 'SC%' AND cnty_Group NOT LIKE 'CP%') 
BEGIN 
    SET @Msg = Participants in Group' + @txtGroup + 'are not eligible to participate in this event' 
    SELECT @Msg AS 'User' 
    RETURN 
END 

Когда я попытался выполнить вышеуказанную хранимую процедуру с помощью следующего кода ниже, он всегда возвращает значение NULL.

DECLARE @Msg varchar(1000) 

EXEC [dbo].[SP_GetList] 
     @fname = N'Jenny', 
     @lname = N'Craig', 
     @dob = N'04/02/1956', 
     @txtGroup = N'DD06A', 
     @Msg = @Msg OUTPUT 

SELECT @Msg as N'@Msg' 


GO 

Мы ожидаем, что либо увидеть followng сообщение:

Участники группы DD06A не имеют права принимать участие в этом мероприятии

или пользователь, который имеет право участвовать.

Любые идеи, что я делаю неправильно?

Заранее спасибо

+3

Side Примечание: вы должны ** ** не использовать 'sp_' префикс для хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

Спасибо за этот кусок советов @marc_s. Я сделаю это изменение, как отмечалось позже, как только я смогу правильно работать над этим материалом. – Kenny

+0

Невозможно скомпилировать команду 'SET'. Не могли бы вы исправить опечатку и убедиться, что представленный код является точным? --thnx – RBarryYoung

ответ

0

Печать ваш запрос, кажется, нет никакого результата с этими условиями.

Также like '%@lname%' кажется неправильным. вы должны использовать like '%' + @lname + '%'. То же самое с остальными параметрами.

ALTER PROCEDURE [dbo].[SP_GetList] 
          @fname nvarchar(50), 
          @lname nvarchar(50), 
          @dob nvarchar(50), 
          @txtGroup varchar(50), 
          @Msg VARCHAR(1000) OUT 

AS 
SET NOCOUNT ON; 
-- added to prevent extra result sets from interfering with SELECT statements. 

IF exists(SELECT 'AKRON' AS CodeName, a.voter_id AS voter_id_vre, a.cnty_Group, a.district_combo, a.voter_fname, a.voter_mname, a.voter_lname, a.voter_suffix, COALESCE(a.str_number,'')+' '+COALESCE(a.str_name,'')+' '+COALESCE(a.str_suffix,'')+' '+COALESCE(a.str_apt,'') AS res_addr, 
       a.str_city, 'OH' AS str_state, a.str_zip, COALESCE(a.mail_str_num,'')+' '+COALESCE(a.mail_str_name,'')+' '+COALESCE(a.mail_srt_suff,'')+' '+COALESCE(a.mail_apt,'')+' '+COALESCE(a.mail_city,'')+' '+COALESCE(a.mail_state,'')+' '+COALESCE(a.mail_zip,'') AS mail_address, a.dob, (SELECT COUNT(*) FROM dbo.voter_record_supp WHERE dbo.voter_record_supp.voter_ID = a.voter_ID) AS [exists], b.* FROM dbo.voter_record a LEFT OUTER JOIN dbo.voter_record_supp b ON a.voter_id=b.voter_id 
       WHERE a.voter_fname Like '%' + @fname + '%' And a.voter_lname Like '%' + @lname + '%' And a.dob = @dob 
       AND voter_status IN ('A','I') AND cnty_Group NOT LIKE 'ML%' AND cnty_Group NOT LIKE 'PA%' AND cnty_Group NOT LIKE 'MP%' AND cnty_Group NOT LIKE 'CH%' AND cnty_Group NOT LIKE 'SC%' AND cnty_Group NOT LIKE 'CP%') 
BEGIN 
    SET @Msg = 'Participants in Group' + @txtGroup + 'are not eligible to participate in this event' 
    SELECT @Msg AS 'User' 
    RETURN 
END 
+0

спасибо за быстрый ответ. Что вы подразумеваете под «Распечатать мой запрос» – Kenny

+0

, вы можете напечатать то, что на самом деле выглядит ваш запрос. print 'выберите .... из .... где ...' перед тем ваш если. – Jonysuise

+0

Я сделал это, и я получаю записи, которые ожидаю, когда я использую имя, соответствующее требованиям, а также имя, которое этого не делает. Итак, помимо незначительных проблем, которые вы исправили (еще раз спасибо), я до сих пор не могу понять, почему код выполнения не дает правильное сообщение. – Kenny

0

Я думаю, что ключевое слово RETURN не нужен здесь ..... Попробуйте точно такой же код без ключевого слова RETURN.

ALTER PROCEDURE [dbo].[SP_GetList] 
          @fname nvarchar(50), 
          @lname nvarchar(50), 
          @dob nvarchar(50), 
          @txtGroup varchar(50), 
          @Msg VARCHAR(1000) OUT 

AS 
SET NOCOUNT ON; 
-- added to prevent extra result sets from interfering with SELECT statements. 

IF exists(SELECT 'AKRON' AS CodeName, a.voter_id AS voter_id_vre, a.cnty_Group, a.district_combo, a.voter_fname, a.voter_mname, a.voter_lname, a.voter_suffix, COALESCE(a.str_number,'')+' '+COALESCE(a.str_name,'')+' '+COALESCE(a.str_suffix,'')+' '+COALESCE(a.str_apt,'') AS res_addr, 
       a.str_city, 'OH' AS str_state, a.str_zip, COALESCE(a.mail_str_num,'')+' '+COALESCE(a.mail_str_name,'')+' '+COALESCE(a.mail_srt_suff,'')+' '+COALESCE(a.mail_apt,'')+' '+COALESCE(a.mail_city,'')+' '+COALESCE(a.mail_state,'')+' '+COALESCE(a.mail_zip,'') AS mail_address, a.dob, (SELECT COUNT(*) FROM dbo.voter_record_supp WHERE dbo.voter_record_supp.voter_ID = a.voter_ID) AS [exists], b.* FROM dbo.voter_record a LEFT OUTER JOIN dbo.voter_record_supp b ON a.voter_id=b.voter_id 
       WHERE a.voter_fname Like '%fname%' And a.voter_lname Like '%@lname%' And a.dob = @dob 
       AND voter_status IN ('A','I') AND cnty_Group NOT LIKE 'ML%' AND cnty_Group NOT LIKE 'PA%' AND cnty_Group NOT LIKE 'MP%' AND cnty_Group NOT LIKE 'CH%' AND cnty_Group NOT LIKE 'SC%' AND cnty_Group NOT LIKE 'CP%') 
BEGIN 
    SET @Msg = Participants in Group' + @txtGroup + 'are not eligible to participate in this event 
END 

Ключевое слово RETURN используется для завершения выполнения кода

+0

Я удалил ключевое слово RETURN, но я все еще не вижу сообщение, которое я ожидаю увидеть. Jonysuise, даже помещая кавычки, пока не показывает сообщение, когда я намеренно тестирую записи, которые должны выставлять сообщение. – Kenny

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