在exec中创建存储过程和错误

时间:2016-11-28 11:12:31

标签: sql-server

嗨我想创建存储过程,如下面的代码

create procedure IDnext (
@tablename nvarchar(50),
@ret int output
)
as
begin
declare @S nvarchar(max) = 'select max(id) from'+@tablename
set @ret = 0
exec sp_executesql @S, N'@x int out', @ret out
end

然后运行此查询

declare @va int;
exec dbo.IDnext 'courses' , @va output
select @va

但我收到此错误

  

Msg 207,Level 16,State 1,Line 31   列名称无效' id'。

我的课程表有id列。

2 个答案:

答案 0 :(得分:1)

一些变化

create procedure IDnext 
 @tablename SYSNAME,    --<-- use appropriate data type for sql server objects
 @ret int output
as
begin
   SET NOCOUNT ON;
 declare @S nvarchar(max);

 SET @S = N'select @ret = max(id) from '+ QUOTENAME(@tablename) -- give space after "From"

exec sp_executesql @S
                 , N'@ret int output'
                 , @ret output
end

还可以使用QUOTENAME()函数强制在表名周围使用sqaure括号,从而避免sql注入。

重要提示

此外,您应该使用Identity column并让sql server处理您的增量值。如果使用SQL Server 2012或更高版本Sequence是另一种选择。

答案 1 :(得分:0)

KeyIdNum    Property    IdNum
1   12  1234
1   12  1234
1   44  1234
1   12  1234
1   56  1234
2   12  4567
3   12  6789
3   56  6789
3   12  6789
4   44  3434
5   12  4444
6   44  9999
6   44  9999

这是我的表Iam使用下面相同的程序

create procedure IDnext (
@tablename nvarchar(50),
@ret int output
)
as
begin
declare @S nvarchar(max) = 'select max(KeyIdNum)  from ' +@tablename
set @ret = 0
exec sp_executesql @S, N'@x int out', @ret out
end

declare @va int;
exec dbo.IDnext 'Table19' , @va output
select @va

我获得程序6和选择0的输出 在您的代码中,select语句表名称的作用类似于别名