嗨,我想创建像
的代码一样创建存储过程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名称