2016-01-13 1 views
1

Я пытаюсь создать хранимую процедуру с использованием T-SQL для вставки переменных в таблицу. Используя метод, о котором я знаю, вы объявляете переменные при создании хранимой процедуры, но я считаю, что можно объявить переменные как часть инструкции exec, чтобы сделать динамическую вставку. Я googled и googled и googled и не могу найти что-нибыдь которое поддерживает это.T-SQL Хранимая процедура, объявляющая переменные в exec

Вот мой пример кода, как он стоит со статическими переменными:

create procedure spInsert as 
    declare @insertValueOne varchar(5) = 'Test1' 
    declare @insertValueTwo varchar(5) = 'Test2' 
    declare @insertValueThree varchar(5) = 'Test3' 
    declare @insertValueFour varchar(5) = 'Test4' 

begin 

insert into testTable 
(ValueOne, ValueTwo, ValueThree, ValueFour) 
values 
(@insertValueOne, @insertValueTwo, @insertValueThree, @insertValueFour) 

end 

exec spInsert 

То, что я пытаюсь достичь, это ситуация, в которой я могу можно использовать сценарий выполнения, как это, например:

exec spInsert('Test1', 'Test2', 'Test3', 'Test4') 

Вместо создания статических переменных в процедуре. Предоставление пользователю возможности выполнять хранимую процедуру без внесения изменений в ее содержимое.

Имеет ли это смысл? Любые идеи?

+0

Я думаю, вам просто нужно удалить скобки. –

+0

скобки после exec spInsert? будет ли он просто вставлять мои переменные в последовательный порядок, в котором они были объявлены? thx – roastbeeef

ответ

1

Используйте aguments со значением вместо локальных переменных по умолчанию:

create procedure dbo.spInsert 
    @insertValueOne varchar(5) = 'Test1' 
    ,@insertValueTwo varchar(5) = 'Test2' 
    ,@insertValueThree varchar(5) = 'Test3' 
    ,@insertValueFour varchar(5) = 'Test4' 
AS 
BEGIN 
    -- You can still use local variables 
    -- DECLARE @my_local_variable = UPPER(@insertValueOne); 

    INSERT INTO testTable(ValueOne, ValueTwo, ValueThree, ValueFour) 
    VALUES (@insertValueOne, @insertValueTwo, @insertValueThree, @insertValueFour) 
END; 

Вызов:

-- named parameters (good practice, self-documenting) 
EXEC spInsert @insertValueOne = 'Test1', @insertValueTwo = 'BBB'; 
-- positional parameters(order is crucial) 
EXEC spInsert 'Test1', 'Test2', 'Test3', 'Test4' 

LiveDemo

Именование определяется пользователем хранимая процедура с sp не является наилучшей практики ,


Я думаю, что это выглядит, как мое решение

Нет, это не ваша хранимая процедура не принимает никаких аргументов.

create procedure spInsert as 
    declare @insertValueOne varchar(5) = 'Test1' 
    declare @insertValueTwo varchar(5) = 'Test2' 
    declare @insertValueThree varchar(5) = 'Test3' 
    declare @insertValueFour varchar(5) = 'Test4' 

begin 

insert into testTable 
(ValueOne, ValueTwo, ValueThree, ValueFour) 
values 
(@insertValueOne, @insertValueTwo, @insertValueThree, @insertValueFour) 

end 
+0

Я думаю, что это похоже на мое решение, однако я бы хотел, чтобы некоторые переменные static и некоторые были динамическими аргументами - возможно ли это? будут ли значения по умолчанию оставаться «Test1» и т. д., пока я их не перепишу? спасибо за комментарий re: лучшая практика, я переименую их в нечто другое. Кроме того, когда вы говорите, что позиционные параметры - это просто запись заданных переменных в том порядке, в котором они были созданы? – roastbeeef

+0

@roastbeeef Играть с LiveDemo. Конечно, вы можете добавить локальные переменные в свою хранимую процедуру. С позиционным параметром порядок очень важен. – lad2025

0

Я надеюсь, что это помогает .. удалить круглые скобки

exec spInsert 'Test1', 'Test2', 'Test3', 'Test4' 
0

Вы почти там. Ваш код содержит несколько ошибок. Мой пример демонстрирует лишь часть того, что может быть достигнуто с помощью хранимых процедур. Дополнительную информацию см. В Microsoft MSDN help docs on procedures.

В этом примере используется временная процедура (хэш перед именем делает это темп). Но принципы применимы к обычным СП.

SP

/* Declares a temp SP for testing. 
* The SP has two parameters, each with a default value. 
*/ 
CREATE PROCEDURE #TempExample 
    (
     @ValueOne VARCHAR(50) = 'Default Value One', 
     @ValueTwo VARCHAR(50) = 'Default Value Two' 
    ) 
AS 
SET NOCOUNT ON; 
BEGIN 

    SELECT 
     @ValueOne AS ReturnedValueOne, 
     @ValueTwo AS ReturnedValueTwo  
END 
GO 

Я включил SET NOCOUNT ON заявление. MSDN рекомендует это в разделе, посвященном передовой практике.

Используйте инструкцию SET NOCOUNT ON как первый оператор в корпусе . То есть, разместите его сразу после ключевого слова AS.Это вызывает сообщения, которые SQL Server отправляет обратно клиенту после выполнения каких-либо операторов SELECT, INSERT, UPDATE, MERGE и DELETE. Общая производительность базы данных и приложения улучшена на , устраняя ненужные сетевые издержки.

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

Пример вызова

/* We can declare varaiabels outside the SP 
* to pass in values. 
*/ 
DECLARE @ParamOne VARCHAR(50) = 'Passed Value One'; 

/* Calling the SP with params. 
* You can use variables or hard coded values. 
*/ 
EXECUTE #TempExample @ParamOne, 'Passed Value Two'; 
Смежные вопросы