T-SQL存储过程,在exec中声明变量
我正在尝试使用T-SQL创建一个存储过程,以将变量插入表中。使用我所知道的方法,可以在创建存储过程时声明变量,但我相信可以将变量声明为exec语句的一部分,以使insert动态。我一直在谷歌上搜索,但找不到任何支持这一点的东西 下面是我的静态变量示例代码:T-SQL存储过程,在exec中声明变量,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我正在尝试使用T-SQL创建一个存储过程,以将变量插入表中。使用我所知道的方法,可以在创建存储过程时声明变量,但我相信可以将变量声明为exec语句的一部分,以使insert动态。我一直在谷歌上搜索,但找不到任何支持这一点的东西 下面是我的静态变量示例代码: create procedure spInsert as declare @insertValueOne varchar(5) = 'Test1' declare @insertValueTwo varchar(5) = 'T
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
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;
我试图实现的是这样一种情况,即我可以使用如下执行脚本,例如:
exec spInsert('Test1', 'Test2', 'Test3', 'Test4')
而不是在过程中创建静态变量。允许用户在不修改存储过程内容的情况下执行存储过程
这有意义吗?
有什么想法吗?使用带有默认值的变量,而不是局部变量:
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
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;
电话:
使用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
我希望这有帮助。。
删除括号
exec spInsert 'Test1', 'Test2', 'Test3', 'Test4'
你快到了。您的代码包含一些错误。我的示例仅演示了使用存储过程可以实现的功能的一小部分。有关更多信息,请参阅Microsoft的MSDN 该示例使用一个temp过程(名称前面的散列使其成为temp)。但这些原则适用于常规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。MSDN在“最佳实践”一节中对此提出了建议
将SETNOCOUNT 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';
我想你只需要去掉括号。exec spInsert后面的括号?它会按照声明变量的顺序插入变量吗?thxI认为这看起来像我的解决方案,然而,我希望一些变量是静态的,一些是动态的,这可能吗?在我覆盖它们之前,默认值会保持为“Test1”等吗?谢谢你关于“最佳实践”的评论,我将把它们重命名为其他名称。另外,当你说位置参数时,这是否只是在按照预设变量创建的顺序编写它们?roadbeeef使用LiveDemo。当然,您可以将局部变量添加到存储过程中。对于位置参数,顺序非常重要。