2011-06-15 51 views
3
declare @id int 
execute getLastRaw 'subjectID','tblSubject', @id output 
print @id 

alter procedure getLastRaw @column char(20), @tbl Char(20), 
@return int output 
as 
declare @dynSQL varchar(100) 
select @dynSQL ='SELECT TOP 1 '[email protected]+'='+ @column + ' FROM ' + @tbl + ' ORDER BY ' + @column + ' DESC' 
exec(@dynsQL) 

我想获取从select语句中选择的值。但它说:当在SQL中给出表名,列时如何检索特定值过程

Msg 245, Level 16, State 1, Procedure getLastRaw, Line 5 
Conversion failed when converting the varchar value 'SELECT TOP 1 ' to data type int. 
+0

欢迎来到本网站。请记住阅读本网站的工作方式:http://meta.stackexchange.com/q/7237/27535 – gbn 2011-06-15 18:04:57

+1

您需要阅读:http://www.sommarskog.se/index.html如果您要继续使用动态SQL。当我看到有人想要传递表和列名时,我知道他们正在做的事情可能会在他们的系统中造成麻烦。在数据库中泛化是一件坏事。这个链接也可能有帮助:http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/ – HLGEM 2011-06-15 18:13:51

回答

2
  1. 当您连接@返回SQL Server试图整个表达式为int,因为datatype precedence

  2. 不能外部或动态的内部分配@return转换SQL,因为范围:存储过程和动态SQL是不同的。局部变量是当地的范围仅

你将不得不使用临时表:虽然,它这是每个连接,可供内部范围(动态SQL)

... 
declare @dynSQL varchar(100) 

select @dynSQL ='SELECT TOP 1 '+ @column + ' FROM ' + @tbl + ' ORDER BY ' + @column + ' DESC' 

CREATE TABLE #result (rtn int) 

INSERT #result (rtn) 
exec(@dynsQL) 

SELECT @return = rtn FROM #result 
GO 

使用正确的选择一样容易和更正确...

declare @id int 
SELECT @id = subjectID FROM tblSubject ORDER BY subjectID DESC 
print @id 
+0

哇......它的工作......谢谢你。 ..yeah我有你的观点,我只是想在其他几个插入程序中调用该程序,但使用简单的选择程序非常简单,似乎....本网站rox ...我将成为此的常规用户.. 。我正在做我的软件工程学士学位,我觉得这是获得和分享事物的最佳场所..再次感谢您的快速回复...... – Gihan 2011-06-15 18:14:19

相关问题