Хранимые процедуры, возвращающие разное количество столбцов

#sql #sql-server #tsql #stored-procedures #procedure

Вопрос:

Я написал хранимую процедуру, но она работает не так, как мне нужно

 CREATE OR ALTER PROCEDURE get_info 
@id int = NULL,
@lang nvarchar(15) = NULL
AS
BEGIN
 SET NOCOUNT ON;
 SELECT id,
   CASE @lang
    WHEN 'ru' THEN text_ru
    WHEN 'en' THEN text_en
    ELSE (text_en, text_ru)
   END
 FROM task_text
 WHERE (@id IS NULL OR id = @id);
END
 

Это не работает, потому что регистр не может возвращать 2 значения.

Моя идеальная хранимая процедура должна работать следующим образом:

 exec get_info --> full table id, text_ru, text_en
exec get_info @id = 1 --> specific id, text_ru, text_en
exec get_info @lang = 'ru' --> full id, text_ru
exec get_info @id = 1, @lang = 'ru'--> specific id, text_ru, @lang
 

Комментарии:

1. Почему бы всегда не возвращать одинаковое количество столбцов и просто игнорировать язык, который вам не нужен? Способ возврата другого количества столбцов (который я не рекомендую, потому что это усложняет ситуацию) Состоит в том, чтобы использовать второй выбор и использовать оператор IF, чтобы определить, какой выбор следует выполнить.

Ответ №1:

Вы можете попробовать, написав процедуру следующим образом

 CREATE OR ALTER PROCEDURE get_info 
    @id int = NULL,
    @lang nvarchar(15) = NULL
AS
BEGIN
SET NOCOUNT ON;

IF @lang = 'ru'
BEGIN
   SELECT id,text_ru
   FROM task_text
   WHERE (@id IS NULL OR id = @id);
END
IF @lang = 'en'
BEGIN
   SELECT id,text_en
   FROM task_text
   WHERE (@id IS NULL OR id = @id);
END
IF @lang IS NULL
BEGIN
   SELECT id,text_ru,text_ru
   FROM task_text
   WHERE (@id IS NULL OR id = @id);
END
END