Насколько я знаю, что Вы не можете сделать этого со строкой. Формат... необходимо было бы обработать это сами. Вы могли просто разделить все нечисловые символы и затем сделать что-то как:
string.Format("({0}) {1}-{2}",
phoneNumber.Substring(0, 3),
phoneNumber.Substring(3, 3),
phoneNumber.Substring(6));
Это предполагает, что данные были введены правильно, который Вы могли использовать регулярные выражения для проверки.
Путаница в какой-то степени оправдана - и другие СУБД, такие как Oracle, действительно имеют параметры хранимых процедур, которые могут иметь тип IN
(только ввод), OUT
(только вывод) или INOUT
(в обоих направлениях - тип параметра «передача по ссылке»).
SQL Server здесь немного неаккуратен, поскольку он помечает параметр как OUTPUT
, но на самом деле это означает INPUT
/ OUTPUT
- это просто означает, что сохраненная процедура имеет шанс вернуть значение из своего вызова в этом параметре.
Итак да - даже если он называется параметром OUTPUT
, на самом деле это скорее параметр INPUT
/ OUTPUT
и те IN
, INOUT
, OUT
, как в Oracle, не существует в SQL Server (в T-SQL).
Я могу дать вам короткий пример того, как создать хранимую процедуру с выходным параметром.
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.
Да, вы можете использовать параметр 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
В дополнение к тому, что другие сказали выше, параметры 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;
}
Вопрос в том - почему вы хотите запретить ввод данных? В этом нет никакого смысла. Рассмотрим этот простой пример:
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
Посмотрите - как вы должны получить значение из , если сначала не поместите переменную в ?
Подумайте о ВЫХОДНЫХ ПАРАМЕТРАХ как о переданных по ссылке в языках программирования, это то же самое. Лучший пример, который я могу сейчас придумать, - это возврат кода ошибки. Вам нужна вставка ... если вы выберете код возврата из SP, вы должны вернуть его в свой код, с параметром OUTPUT, которого у вас нет, он уже будет в вашем параметре (я имею в виду использование команд C #, PHP init хранимые методы процедуры или что-то другое, чем построение строк)