Sql server 对象ID未检测到SQL Server中最近创建或删除的表
我在使用Object_ID检测表是否已经存在时遇到问题。 它在第一次迭代中运行良好,并允许正确创建所需的表。 但是如果再次执行,它仍然认为/看到表没有创建,并尝试创建表,然后SQLServer给出错误消息,即表已经存在。 SQL Server 2008版 代码Sql server 对象ID未检测到SQL Server中最近创建或删除的表,sql-server,Sql Server,我在使用Object_ID检测表是否已经存在时遇到问题。 它在第一次迭代中运行良好,并允许正确创建所需的表。 但是如果再次执行,它仍然认为/看到表没有创建,并尝试创建表,然后SQLServer给出错误消息,即表已经存在。 SQL Server 2008版 代码 --Alter Proc spCreateCustomerChartTables --As Begin Declare @mycursorMARKET Cursor, @mycursorCUSTOMER Cursor, @MarketN
--Alter Proc spCreateCustomerChartTables
--As
Begin
Declare
@mycursorMARKET Cursor,
@mycursorCUSTOMER Cursor,
@MarketNameEnglish nchar(30),
@CustomerID nchar(10),
@DDate date,
@textdate as nchar(12),
@tableName nchar(100),
@sqlcmd as nvarchar(500)
Set @DDate = GETDATE()
Set @mycursorMARKET = Cursor for Select Distinct MarketNameEnglish From dbo.tableMarketName Order by MarketNameEnglish ASC
Open @mycursorMARKET
Fetch Next From @mycursorMARKET Into @MarketNameEnglish
While @@FETCH_STATUS = 0
Begin
Set @mycursorCUSTOMER = Cursor for Select Distinct CustomerID From dbo.CustomerEmployeeDetail Order by CustomerID ASC
Open @mycursorCUSTOMER
Fetch Next From @mycursorCUSTOMER Into @CustomerID
While @@FETCH_STATUS =0
Begin
Set @textdate = cast(@DDate as NCHAR(12))
Set @tableName = RTrim(@MarketNameEnglish) + '_' + RTrim(@CustomerID) + '_' + RTrim(@textdate )
If OBJECT_ID(@tableName , 'U') IS Not Null
--IF Not EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
-- WHERE TABLE_NAME = @tableName )
Begin
Print 'Table Does Not Exist'
Set @sqlcmd = 'Select * Into ' + RTrim(@tableName) + ' From BlankChart'
Set @sqlcmd = RTRIM(@sqlcmd)
Set @sqlcmd = REPLACE (@sqlcmd, '-', '_')
Exec(@sqlcmd)
End
Else
Begin
Print 'Table Exists'
Set @sqlcmd = 'Drop Table ' + @tableName
Set @sqlcmd = RTRIM(@sqlcmd)
Set @sqlcmd = REPLACE (@sqlcmd, '-', '_')
Exec(@sqlcmd)
End
--Print @sqlcmd --Create chart tables here
Fetch Next From @mycursorCUSTOMER Into @CustomerID
End
--Print @MarketNameEnglish
Fetch Next From @mycursorMARKET Into @MarketNameEnglish
End
Close @mycursorMARKET
Deallocate @mycursorMARKET
Close @mycursorCUSTOMER
Deallocate @mycursorCUSTOMER
End
您的情况是“颠倒的”:
如果对象ID(@tableName,'U')不为空,您的
应更改为如果对象ID(@tableName,'U')为空,则最终在我的代码中找到了错误。它与对象ID无关。
实际上,变量@tablename的格式设置不正确,位置也不正确。tablename中日期的破折号(-)未替换为下划线(\ux)。这是导致错误的原因。如果OBJECT_ID(@tableName,'U')不为Null,则此行***的输出将保持不变,无论该表是否实际存在。如果第一次为真,则在每次迭代中都保持为真。如果第一次为false,则在每次迭代中都会保持false。该SQL看起来非常容易注入。你到底想在这里实现什么?如果OBJECT\u ID
表示该对象没有ID,则该对象不存在;这是肯定的。另外,OBJECT\u ID
如何提供最近删除的对象的值?您的IF
语句是错误的OBJECT_ID(@tableName,'U')
如果表存在,则不为空;如果表不存在,则不为空。因此,您实际上是说,如果表存在,则选择该表,否则(如果表不存在)将其删除。顺便说一句,这似乎是一个巨大的代码气味。究竟为什么每天都要为每个客户创建一个新表?您还应该始终注意声明尽可能最简单的游标。如果您仅从光标读取,请告诉SQL server并将其声明为READONLY
;如果您仅在光标中向前移动,请告诉SQL server并将其声明为forward\u only
;如果您仅在本地使用,请将其声明为LOCAL
等。更多阅读: