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



嗨,我想创建像

的代码一样创建存储过程
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,16级,状态1,第31行 无效列名称" id"。

我的课程表具有ID列。

一些更改

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是您的另一个选择。

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

iam获取过程6的输出和选择0在您的代码中,在SELECT语句中的表格名称像Alias名称

最新更新