在 SQL 服务器中调用过程时出错

Error When Calling Procedure In SQL Server

我正在尝试在 SQL 服务器中创建一个过程。到目前为止,这是我的尝试:

create proc sp_cr_tbl(@table_name text)
--returns integer
as
begin
declare @sql nvarchar(4000)     
set @sql = 'create table @table_name(id integer)'
exec sp_executesql @sql
end 

它创建成功但是当我调用

EXEC sp_cr_tbl 'tbl_9'

我收到以下错误:

ErrorMessage: Incorrect syntax near '@table_name'.

我是 SQL 服务器的新手,我在 Postgre 中开发过同样的东西SQL

将您的程序代码更改为:

CREATE PROCEDURE cr_tbl (@table_name NVARCHAR(30))
AS
BEGIN
    DECLARE @sql NVARCHAR(4000)

    SET @sql = 'create table ' + @table_name + ' (id integer)'

    EXEC sp_executesql @sql
END

这是动态的 SQL,您需要将要创建的 table 的名称附加到命令查询 (@sql),然后执行此命令。

您可以在 EXEC 之前添加一个 PRINT @sql 语句,以准确查看查询在执行之前的样子。

此外,我建议您不要使用 TEXTNTEXT 数据类型并将变量作为 NVARCHAR 传递,因为您还为 @[=47 设置了数据类型=] 变量为 NVARCHAR,并在过程声明中为参数指定大小。

另外,请注意@marc_s所说的,不要使用sp作为存储过程的前缀,因为它已被Microsoft保留。

因此,为了调用上面的存储过程我推荐你使用:

EXEC cr_tbl @table_name='tbl_9'

建议:

指定要传递变量的参数的名称不是强制性的,但我认为如果您创建具有多个参数的存储过程并且要传递多个变量,将来它会派上用场。

如果您明确指定将哪些变量传递给哪些参数,这将有助于避免错误(否则,如果您不指定,那么您传递的参数的顺序将很重要!).

下面的查询可以帮到你

create proc sp_cr_tbl(@table_name text)
 --returns integer
as
begin
 declare @sql nvarchar(4000)     
  set @sql = 'create table ' + convert(nvarchar(4000), @table_name) + ' (id integer)'
  exec sp_executesql @sql
end