Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL存储过程,在exec中声明变量_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

T-SQL存储过程,在exec中声明变量

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

我正在尝试使用T-SQL创建一个存储过程,以将变量插入表中。使用我所知道的方法,可以在创建存储过程时声明变量,但我相信可以将变量声明为exec语句的一部分,以使insert动态。我一直在谷歌上搜索,但找不到任何支持这一点的东西

下面是我的静态变量示例代码:

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。当然,您可以将局部变量添加到存储过程中。对于位置参数,顺序非常重要。