Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对象ID未检测到SQL Server中最近创建或删除的表_Sql Server - Fatal编程技术网

Sql server 对象ID未检测到SQL Server中最近创建或删除的表

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

我在使用Object_ID检测表是否已经存在时遇到问题。 它在第一次迭代中运行良好,并允许正确创建所需的表。 但是如果再次执行,它仍然认为/看到表没有创建,并尝试创建表,然后SQLServer给出错误消息,即表已经存在。 SQL Server 2008版

代码

--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
等。更多阅读: