我尝试使用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 :(得分: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
答案 1 :(得分:0)
我希望这会有所帮助.. 删除括号
exec spInsert 'Test1', 'Test2', 'Test3', 'Test4'
答案 2 :(得分:0)
你快到了。您的代码包含一些错误。我的例子只展示了存储过程可以实现的一小部分。有关详情,请参阅Microsoft的MSDN help docs on procedures。
该示例使用临时过程(名称前面的散列使其成为临时)。但这些原则适用于常规SP。
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';