在SQL Server中调用过程时出错

时间:2015-01-06 11:25:50

标签: sql-server tsql dynamic-sql

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

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:' @ table_name'。

附近的语法不正确

我是SQL Server的新手,我在PostgreSQL中开发了同样的东西

2 个答案:

答案 0 :(得分:2)

将程序代码更改为:

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,您需要将要创建的表的名称附加到命令查询(@sql),然后执行此操作。

您可以在PRINT @sql之前添加EXEC语句,以便在查询执行之前确切了解查询的外观。

另外,我建议您不要使用TEXTNTEXT数据类型并将变量作为NVARCHAR传递,因为您还将@sql变量的数据类型设置为{{ 1}},并且在过程的声明中给参数一个大小。

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

因此,为了调用上述存储过程,我建议您使用:

sp

<强> 建议:

指定要传递变量的参数的名称并不是必须的,但我认为如果您创建具有多个参数的存储过程并且想要传递多个变量,它将在以后派上用场。

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

答案 1 :(得分:0)

以下查询将为您提供帮助

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