Проблема выходного параметра SQL Server

Насколько я знаю, что Вы не можете сделать этого со строкой. Формат... необходимо было бы обработать это сами. Вы могли просто разделить все нечисловые символы и затем сделать что-то как:

string.Format("({0}) {1}-{2}",
     phoneNumber.Substring(0, 3),
     phoneNumber.Substring(3, 3),
     phoneNumber.Substring(6));

Это предполагает, что данные были введены правильно, который Вы могли использовать регулярные выражения для проверки.

32
задан ROMANIA_engineer 18 August 2017 в 16:13
поделиться

6 ответов

Путаница в какой-то степени оправдана - и другие СУБД, такие как Oracle, действительно имеют параметры хранимых процедур, которые могут иметь тип IN (только ввод), OUT (только вывод) или INOUT (в обоих направлениях - тип параметра «передача по ссылке»).

SQL Server здесь немного неаккуратен, поскольку он помечает параметр как OUTPUT , но на самом деле это означает INPUT / OUTPUT - это просто означает, что сохраненная процедура имеет шанс вернуть значение из своего вызова в этом параметре.

Итак да - даже если он называется параметром OUTPUT , на самом деле это скорее параметр INPUT / OUTPUT и те IN , INOUT , OUT , как в Oracle, не существует в SQL Server (в T-SQL).

60
ответ дан 27 November 2019 в 19:58
поделиться

Я могу дать вам короткий пример того, как создать хранимую процедуру с выходным параметром.

CREATE PROCEDURE test_proc

@intInput int,
@intOutput int OUTPUT

AS
set @intOutput = @intInput + 1 

go

И чтобы вызвать эту процедуру, а затем использовать выходной параметр, выполните следующие действия:

declare @intResult int
exec test_proc 3 ,@intResult OUT
select @intResult

Вы видите, что вы должны сначала объявить выходную переменную. И после выполнения хранимой процедуры выходное значение будет в вашей переменной. Вы можете установить любое значение для выходной переменной, но после выполнения хранимой процедуры она будет содержать именно то, что хранимая процедура возвращает (независимо от того, какое значение было в выходной переменной).

Например:

declare @intResult int
exec test_proc 3 ,@intResult OUT
select @intResult

Он вернет 4. И :

declare @intResult int
set @intResult = 8
exec test_proc 3 ,@intResult OUT
select @intResult

Также вернуть 4.

19
ответ дан 27 November 2019 в 19:58
поделиться

Да, вы можете использовать параметр OUTPUT как для передачи, так и для получения значений (хотя на данный момент я не могу придумать веской причины для этого).

Вот тривиальный пример Пример, демонстрирующий это:

-- The stored procedure
CREATE PROCEDURE OutParamExample
    @pNum int OUTPUT
AS
BEGIN
    select @pNum
    set @pNum = @pNum + 5
END
GO

-- use a local variable to retrieve your output param value
declare @TheNumber int
set @TheNumber = 10

print @TheNumber
exec OutParamExample @TheNumber OUTPUT
print @TheNumber

Результаты будут выглядеть так:

10

-----------
10

(1 row(s) affected)

15

РЕДАКТИРОВАТЬ: Хорошо, я думаю, что пропустил «не» во втором абзаце и, возможно, не ответил на заданный вами вопрос. Если вам нужен строгий выходной параметр (например, что-то вроде кода возврата), вам, конечно, не нужно предоставлять значение для локальной переменной, переданной в качестве выходного параметра, но вы все равно должны объявить эту локальную переменная, чтобы у вас был способ доступа к возвращаемому значению вне области действия самой процедуры.

Например:

declare @LocalNumber int
-- I don't have to assign a value to @LocalNumber to pass it as a parameter
exex OutParamExample @LocalNumber OUTPUT  
-- (assume SP has been altered to assign some reasonable value)

-- but I do have to declare it as a local variable so I can get to
-- the return value after the stored procedure has been called
print @LocalNumber
6
ответ дан 27 November 2019 в 19:58
поделиться

В дополнение к тому, что другие сказали выше, параметры OUTPUT могут действовать как ВХОД, а также ВЫХОД. Но это зависит от хранимой процедуры, чтобы использовать переданное ей значение.

Если хранимые процедуры игнорируют значение, переданное для параметра OUTPUT (что обычно и должно), значение INPUT все равно игнорируется.

Использование Сергея. кода, я могу использовать значение, переданное пользователем для @intOutput (если мне нужно)

create PROCEDURE test_proc

@intInput int,
@intOutput int OUTPUT

AS
set @intOutput = @intOutput + 1 

go

Но, Чтобы дать другое представление, компилятор C # вынуждает вас перезаписывать значение параметра out путем присваивания (без использования параметра output).

например, я не могу сделать это в C #. Здесь он действует только как выходной параметр (т.е. игнорирует значение, переданное пользователем в эту функцию)

static void dosomething(out int i)
{
    //i = 0;
    i = i + 1;
}
3
ответ дан 27 November 2019 в 19:58
поделиться

Вопрос в том - почему вы хотите запретить ввод данных? В этом нет никакого смысла. Рассмотрим этот простой пример:

CREATE PROCEDURE test (@param AS INT OUTPUT) AS
BEGIN
  SET @param = 100
END
GO

DECLARE @i INT
SET @i = 0

EXECUTE test @i OUTPUT
PRINT @i

DROP PROCEDURE test

Это напечатает

100

Посмотрите - как вы должны получить значение из , если сначала не поместите переменную в ?

2
ответ дан 27 November 2019 в 19:58
поделиться

Подумайте о ВЫХОДНЫХ ПАРАМЕТРАХ как о переданных по ссылке в языках программирования, это то же самое. Лучший пример, который я могу сейчас придумать, - это возврат кода ошибки. Вам нужна вставка ... если вы выберете код возврата из SP, вы должны вернуть его в свой код, с параметром OUTPUT, которого у вас нет, он уже будет в вашем параметре (я имею в виду использование команд C #, PHP init хранимые методы процедуры или что-то другое, чем построение строк)

2
ответ дан 27 November 2019 в 19:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: