MS SQL SERVER数据库优化顾问错误515

问题描述

@H_404_0@我们正在尝试使用DTA,但它在我们的一台服务器上一直失败。我们在本地和从PC上运行它,结果相同:

@H_404_0@我也找不到在线信息,可以解释为什么会发生这种情况。导致该问题的强化proc与实际上在服务器上工作的服务器不同-但我没有足够的经验来修改这些系统表或系统过程中的任何内容

===================================

Cannot initialize tuning. (.Net sqlClient Data Provider)

===================================

Cannot insert the value NULL into column 'CreationTime',table 'msdb.dbo.DTA_input'; column does not allow nulls. INSERT fails.
Cannot insert the value NULL into column 'SessionID',table 'msdb.dbo.DTA_reports_database'; column does not allow nulls. INSERT fails.
The statement has been terminated.
The statement has been terminated. (.Net sqlClient Data Provider)

------------------------------
For help,click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20sql%20Server&ProdVer=13.00.4001&EvtSrc=MSsqlServer&EvtID=515&LinkId=20476
@H_404_0@上面的帮助链接没有任何作用。在下面的错误中查看更多信息

Server Name: DB1
Error Number: 515
Severity: 16
State: 2
Procedure: sp_DTA_add_session
Line Number: 30
@H_404_0@以及:

Program Location:

   at System.Data.sqlClient.sqlConnection.OnError(sqlException exception,Boolean breakConnection,Action`1 wrapCloseInAction)
   at System.Data.sqlClient.sqlInternalConnection.OnError(sqlException exception,Action`1 wrapCloseInAction)
   at System.Data.sqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncclose)
   at System.Data.sqlClient.TdsParser.TryRun(RunBehavior runBehavior,sqlCommand cmdHandler,sqlDataReader dataStream,BulkcopySimpleResultSet bulkcopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)
   at System.Data.sqlClient.sqlCommand.FinishExecuteReader(sqlDataReader ds,RunBehavior runBehavior,String resetoptionsstring,Boolean isInternal,Boolean forDescribeParameterEncryption,Boolean shouldCacheForAlwaysEncrypted)
   at System.Data.sqlClient.sqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,Boolean returnStream,Boolean async,Int32 timeout,Task& task,Boolean asyncWrite,Boolean inRetry,sqlDataReader ds,Boolean describeParameterEncryptionRequest)
   at System.Data.sqlClient.sqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,String method,taskcompletionsource`1 completion,Boolean& usedCache,Boolean inRetry)
   at System.Data.sqlClient.sqlCommand.InternalExecuteNonQuery(taskcompletionsource`1 completion,String methodName,Boolean sendToPipe,Boolean inRetry)
   at System.Data.sqlClient.sqlCommand.ExecuteNonQuery()
   at Microsoft.sqlServer.Management.DTA.Client.NonQuery.BeginQuery(ServerConnection connection)
   at Microsoft.sqlServer.Management.DTA.Client.TuningConnection.RunSyncQuery(IQuery query)
   at Microsoft.sqlServer.Management.DTA.Client.TuningConnection.ExecuteNonQuery(sqlCommand command)
   at Microsoft.sqlServer.Management.DTA.Client.TuningSession.StoreSessionXml(Boolean isNvarcharColumns)
   at Microsoft.sqlServer.Management.DTA.Client.TuningSession.Start(Boolean withProgressEvents)
   at Microsoft.sqlServer.Management.DTA.Shell.SessionForm.Progressthread()
@H_404_0@显然发生这种情况的存储过程是

USE [msdb]
GO
/****** Object:  StoredProcedure [dbo].[sp_DTA_add_session]    Script Date: 21-Aug-2020 10:59:55 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[sp_DTA_add_session] 
   @SessionName sysname,@TuningOptions nvarchar(max),@SessionID int OUTPUT
as 
    declare @UserName as nvarchar(256) 
    declare @x_SessionName sysname
    declare @ErrorString nvarchar(500)
    declare @XmlDocumentHandle int
    declare @retval int
    declare @dbcount int
    
    set nocount on
    begin transaction
        -- Check for duplicate session name
        select @x_SessionName = @SessionName
        from msdb.dbo.DTA_input
        where SessionName = @SessionName

        if (@x_SessionName IS NOT NULL)
            begin
                rollback transaction
                set @ErrorString = 'The session ' + '"' + LTRIM(RTRIM(@SessionName)) + '"' +' already exists. Please use a different session name.'
                raiserror (31001,-1,@SessionName)
                return(1)
            end     
        
        -- Create new session
                
        insert into msdb.dbo.DTA_input (SessionName,TuningOptions) 
        values (@SessionName,@TuningOptions) 

        select @SessionID = @@identity  

        
        if @@error <> 0
            begin
                rollback transaction
                return @@error
            end             


        if @@error <> 0
            begin
                rollback transaction
                return @@error
            end             

                -- Create an internal representation of the XML document.
                EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT,@TuningOptions,'<DTAXML  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://schemas.microsoft.com/sqlserver/2004/07/dta"/>'
                
                if @@error <> 0
                begin
                    rollback transaction
                    return @@error
                end     
                -- Execute a SELECT statement using OPENXML rowset provider.

                insert into DTA_reports_database
                SELECT    @SessionID,msdb.dbo.fn_DTA_unquote_dbname([x:Name]),1
                FROM      OPENXML (@XmlDocumentHandle,'/x:DTAXML/x:DTAInput/x:Server//x:Database',2)
                        WITH ([x:Name]  nvarchar(128) ) 
                
                if @@error <> 0
                begin
                    rollback transaction
                    return @@error
                end     
            
                EXEC sp_xml_removedocument @XmlDocumentHandle

                if @@error <> 0
                begin
                    rollback transaction
                    return @@error
                end     
                
                

        
            -- Check if allowed to add session
            exec @retval =  sp_DTA_check_permission @SessionID

            if @retval = 1
            begin
                raiserror(31003,-1)
                rollback transaction
                return (1)
            end 

            select @dbcount = count(*) from DTA_reports_database
            where SessionID = @SessionID            
            if @dbcount = 0 
            begin
                rollback transaction
                return (1)
            end

        -- Insert progress record
        insert into [msdb].[dbo].[DTA_progress]
        (SessionID,WorkloadConsumption,EstImprovement,TuningStage,ConsumingWorkLoadMessage,PerformingAnalysisMessage,GeneratingReportsMessage)
        values(@SessionID,N'',N'')

        if @@error <> 0
        begin
            rollback transaction
            return @@error
        end     

        
    -- Commit if input/progress records are updated
    commit transaction
    return 0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)