存储过程如何调用视图/望高手指点

enetdog 2006-03-14 10:54:17
MS SQL中 存储过程写的分页

能调用单表中的数据

现在欲用这个存储过程来调用多个表中的数据

该怎么办??

望高手指点迷津

我是想通过视图将多表合为一表 然后再用存储过程来调用它

测试没成功(没有数据)

还请高手指教

不胜感激
...全文
401 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
enetdog 2006-03-15
本存储过程应该没有问题

exec在查询分析器中是有结果的

可能是ASP权限问题

Class 类中调用这个存储过程的代码

问题在这里:

Set Rs=server.CreateObject("Adodb.RecordSet")
Set Cm=Server.CreateObject("Adodb.Command")
Cm.CommandType=4
Cm.ActiveConnection=oConn
Cm.CommandText="sp_Util_Page"
Cm.parameters(1)=i
Cm.parameters(2)=iPageCurr
Cm.parameters(3)=iPageSize
Cm.parameters(4)=sPkey
Cm.parameters(5)=sField
Cm.parameters(6)=sTable
Cm.parameters(7)=Replace(sCondition," WHERE ","")
Cm.parameters(8)=Replace(sOrderBy," ORDER BY ","")
Rs.CursorLocation=3
Rs.LockType=1
Rs.Open Cm

权限的问题就在
Cm.CommandType=4
Rs.CursorLocation=3
Rs.LockType=1
这3句话里

高手指点一下 改怎么修改!!!!



回复
enetdog 2006-03-15
单表的存储过程 可以 调用视图吗/

应大家要求/将代码贴出来/

存储过程如下

if exists (select * from dbo.sysobjects where id = object_id(N'[sp_Util_Page]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [sp_Util_Page]
GO

CREATE PROCEDURE sp_Util_Page
(
@iRecordCount int OUTPUT,
@iPageCurr int,
@iPageSize int,
@sPkey nvarchar(50),
@sField nvarchar(1000),
@sTable nvarchar(100),
@sCondition nvarchar(1000),
@sOrder nvarchar(100)
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @sCond1 nvarchar(1000),@sCond2 nvarchar(1000)
DECLARE @iAsc int,@iDesc int,@iType tinyint
DECLARE @sTmp nvarchar(1000),@sOrderTmp nvarchar(1000),@sSQL nvarchar(4000)

IF LEN(@sCondition)>2
SELECT @sCond1=' WHERE '+@sCondition+' ', @sCond2=' WHERE '+@sCondition+' AND '
ELSE
BEGIN
SELECT @sCond1='', @sCond2=' WHERE '
END

IF LEN(@sOrder)<4
SELECT @iType=0, @sOrder=''
Else
BEGIN
SET @sOrderTmp=UPPER(@sOrder)
IF CHARINDEX(UPPER(@sPkey),@sOrderTmp)=1--存在主建
SELECT @iAsc=CHARINDEX('ASC',@sOrderTmp), @iDesc=CHARINDEX('DESC',@sOrderTmp)
ELSE
BEGIN
SELECT @iAsc=0, @iDesc=0
END

IF (@iAsc>0 and @iDesc=0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc<@iDesc))
SELECT @iType=1, @sTmp='>(SELECT MAX('
ELSE IF (@iAsc=0 and @iDesc>0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc>@iDesc))
SELECT @iType=1, @sTmp='<(SELECT MIN('
ELSE
BEGIN
SELECT @iType=0
END
SET @sOrder=' ORDER BY '+@sOrder
END

IF @iRecordCount<1
BEGIN
SET @sSQL='SELECT @iRecordCount=Count(0) FROM '+@sTable+@sCond1
EXEC sp_executesql @sSQL,N'@iRecordCount int OUT',@iRecordCount OUT
END

IF @iRecordCount<(@iPageCurr-1)*@iPageSize
SET @iPageCurr=CEILING(@iRecordCount/@iPageSize)
ELSE IF @iPageCurr<1
BEGIN
SET @iPageCurr=1
END

IF @iPageCurr=1
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sCond1+@sOrder
ELSE
BEGIN
IF @iType=1
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sCond2+@sPkey+@sTmp+@sPkey+') FROM (SELECT TOP '+CAST((@iPageCurr-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sCond1+@sOrder+') AS tbTemp)'+@sOrder
ELSE
SET @sSQL='SELECT '+@sField+' FROM '+@sTable+@sCond2+@sPkey+' IN (SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sCond2+@sPkey+' NOT IN(SELECT TOP '+CAST((@iPageCurr-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sCond1+@sOrder+')'+@sOrder+')'+@sOrder
END
--PRINT(@sSQL)
--RETURN(@iRecordCount)
EXEC(@sSQL)

END
GO

应用到单表中是没问题的

但想用他调用视图 不行 没数据

视图代码 (查询分析器中是有数据的)

SELECT dbo.Link.Content, dbo.Link.Title, dbo.Link.LinkTo, dbo.Link.ImagePath,
dbo.Link.SortID, dbo.LinkSort.ID, dbo.LinkSort.Title AS N_SortTitle,
dbo.Link.ID AS L_ID
FROM dbo.Link INNER JOIN
dbo.LinkSort ON dbo.Link.SortID = dbo.LinkSort.ID

我想可能是我的思路错了

可能要将procedure 改成多表的查询 然后再调用
回复
enetdog 2006-03-15
是的
回复
leihentulong 2006-03-15
是exec(‘条件’+@viewname)这个吧
回复
enetdog 2006-03-15
调用 视图 和调用表是否是一样的方法!!!

回复
enetdog 2006-03-15
谢谢 各位 的指点

回复2楼 视图正确 能查到数据

再回复 Oliko 兄 先谢谢你的指点
1、
我的存储过程是调用单表的 使用了参数 测试没有问题

现在我想通过视图将 多表合为一表 然后还用这个存储过程来调用

不知道这个思想行得同否

2、
你的意思是在存储过程中就使用多表查询

然后再调用 该如何调用
回复
wgsasd311 2006-03-15
调用表成功,没道理调用视图会失败的,楼主把你的分页存储过程和视图语句贴出来看看.
回复
Oliko 2006-03-15
我是想通过视图将多表合为一表 然后再用存储过程来调用它。
测试没成功(没有数据)

视图的用法与表是一样的。没有数据的原因得先检查视图本身有没有问题,如果在查询分析器可以查到数据,在存储过程中一定也是可以查询到的。另外要关注一下你存储过程是不是使用了参数传值?看看给定的值有没有问题?
回复
Oliko 2006-03-15
现在欲用这个存储过程来调用多个表中的数据该怎么办??

用存储过程调用多个表的数据是没有问题的。比如Select A.*,B.*,C.FName from TableA A inner join TableB B on A.FId=B.FId Left join TableC C on A.FID2=C.FID

之所以没有数据,应该是你的关联语句有问题。在使用联接时,匹配条件过滤掉了数据。如上面例子,查询的结果是A、B表有共同FId的记录,同时附带显示C表中FID与A表相同的记录
回复
mm2love2zz 2006-03-14
只要建立了正确的视图,
那操作视图就和操作表基本相同
回复
huailairen 2006-03-14
有代码吗?
看下。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2006-03-14 10:54
社区公告
暂无公告