问题描述
@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 (将#修改为@)