有一个学生表,带有ID和Name列。但是,想要使用存储过程中的参数来获得:
select * from Student where ID = value; 一会儿,我使用了这段代码。无法承受。此外,我收到此错误消息:
select * from [学生],其中ID = 2消息203,级别16,状态2,过程FindTblName,行11 [批处理开始第28行]名称'select * from [学生],其中ID = 2'是无效的标识符。
create procedure FindTblName @tblName varchar(100), @IDName varchar(10), @IDValue int as begin
declare @sql varchar(max) set @sql = 'select * from '+ QUOTENAME(@tblName) + ' where ' + @IDName + ' = ' + convert(nvarchar(2),@IDValue) print @sql exec @sql end
exec FindTblName @tblName = Student, @IDName = ID, @IDValue = 2;
问题来源于stack overflow
如果必须执行类似的操作,然后正确地引用对象名称并参数化参数。然后将您的对象名称作为nvarchar,而不是未知的“对象”类型传递:
CREATE PROC dbo.FindTblName @TblName sysname , @IDName sysname, @IDValue int AS BEGIN
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM dbo.' + QUOTENAME(@TblName) + N' WHERE ' + QUOTENAME(@IDName) + N' = @IDValue;';
EXEC sp_executesql @SQL, N'@IDValue int', @IDValue;
END; GO
EXEC dbo.FindTblName @TblName = N'Student', @IDName = N'ID', @IDValue = 2;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。