嗨我想创建存储过程,如下面的代码
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列。
答案 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语句表名称的作用类似于别名