2013-03-25 37 views
0

下面的程序将运行在SQL Server 2005中确定,但在2008年... Invalid object name 'vTemp'SQL Server 2008中不能使用动态SQL创建的视图手续

Create PROCEDURE [dbo].[bulksaverecord] 
as 
begin 

if exists (select * from sysobjects where id=object_id('vTemp')) 
begin 
drop view vTemp 
end 

declare @sql nvarchar(max) 
set @sql='CREATE VIEW vTemp AS SELECT top 0 FromType,TypeID,AssessUser, 
      TypeTimeType,AssessTime,ItemRoleKey,UserName,SourceKey, 
      PartID,PartName,PositionName,ItemID,ItemName,ItemType,ItemScript, 
      ItemDataSourceName,ItemField,ItemKPI,ItemFun,ItemFunLimit,ItemKill, 
      AllKill,ItemMark,ItemPower,MarkScript,PowerScript,FromKey 
      FROM AssessMark' 
exec sp_executesql @sql 
if exists (select * from sysobjects where id=object_id('vTemp')) 
begin 
    exec ('SELECT * FROM vTemp') 
    SELECT * FROM vTemp -- throws the error here 
end 

end 

未能看来,视图中创建在PROCEDURE中使用动态SQL,在DYNAMIC SQL中将有一个范围,即使VIEW实际上已创建。

+0

如果你想要一个临时表,为什么你不使用一个?视图并不意味着是模拟对象。 – HLGEM 2013-03-25 19:31:29

回答

0

谢谢!我找到了原因。

我改变了:创建视图来创建dbo.view,问题没有了。 所以

+0

因此,任何人都需要注意您当前的SQL帐户的权利。我遇到这个问题,因为我目前的SQL帐户不是dbo,所以创建视图会创建一个视图,而不是dbo.view。如果你正确设置你的sql acount,你将不会看到这个问题。我希望这会帮助别人。 – ivanchain 2013-04-10 01:45:24

1

这个测试脚本作品多次对我来说:

if object_id('TestProc') is not null 
    drop procedure TestProc 
if object_id('TestView') is not null 
    drop view TestView 
go 
create proc TestProc 
as 
exec ('create view TestView as select 1 as a') 
select * from TestView 
go 
exec TestProc 

像戈登·利诺夫回答,请仔细检查您的视图定义?

select * from information_schema.tables 

我怀疑你有你的观点定义一个问题:当我修改视图定义是

1

你的程序工作在我安装的SQL Server 2008的罚款。

相关问题