Сообщить об изменениях конфигурации
-
29-09-2020 - |
Вопрос
Я создал хранимую процедуру, которую я получил на курсе Эрин Стеллато по Pluralsight, чтобы сообщать о любых изменениях конфигурации на сервере в качестве ночного задания следующим образом:
CREATEPROCEDURE dbo.usp_SysConfigReport1
(
@RecentDate DATETIME,
@OlderDate DATETIME
)
AS
BEGIN;
IF
@RecentDate IS NULL
OR @OlderDate IS NULL
BEGIN;
RAISERROR('Input parameters cannot be NULL', 16, 1);
RETURN;
END;
SELECT
@@SERVERNAME ServerName,
CaptureDate,
[O].[Name],
[O].[Value] AS "OlderValue",
[O].[ValueInUse] AS"OlderValueInUse",
[R].[Value] AS "RecentValue",
[R].[ValueInUse] AS "RecentValueInUse"
FROM [dbo].[ConfigData] O
JOIN
(SELECT [ConfigurationID], [Value], [ValueInUse]
FROM [dbo].[ConfigData]
WHERE [CaptureDate] = @RecentDate) R on [O].[ConfigurationID] = [R].[ConfigurationID]
WHERE [O].[CaptureDate] = @OlderDate
AND (([R].[Value] <> [O].[Value]) OR ([R].[ValueInUse] <> [O].[ValueInUse]))
END
--------
--Capture the capture dates into #temp table1
SELECT DISTINCT
[CaptureDate]
INTO #CapturedDates
FROM [dbo].[ConfigData]
ORDER BY [CaptureDate]
--Create temp table2
CREATE TABLE #CapturedDates2 (
ServerName NVARCHAR(20)
,[CaptureDate] DATETIMEOFFSET
,Name NVARCHAR(1000)
,[OlderValue] INT
,[OlderValueInUse] INT
,[RecentValue] INT
,RecentValueInUse INT
)
------Inserting into Temp2 gin=ving error message as below
DECLARE @MINCapturedDate DATETIME
DECLARE @MAXCapturedDate DATETIME
SELECT @MINCapturedDate =(SELECT CAST(MIN([CaptureDate]) AS DATETIME) FROM #CapturedDates)
SELECT @MAXCapturedDate =(SELECT CAST(MAX([CaptureDate]) AS DATETIME) FROM #CapturedDates)
INSERT INTO #CapturedDates2
EXEC SYSDBA.dbo.usp_SysConfigReport1 @MINCapturedDate ,@MAXCapturedDate
Но это выдает мне следующее сообщение об ошибке:
Сообщение 257, уровень 16, состояние 3, процедура usp_SysConfigReport1, строка 19 Неявное преобразование из типа данных sql_variant в int не разрешено.Используйте функцию CONVERT для выполнения этого запроса.
РЕДАКТИРОВАТЬ:Включить определение ConfigData
CREATE TABLE [dbo].[ConfigData]
( [ConfigurationID] [INT] NOT NULL,
[Name] [NVARCHAR](35) NOT NULL,
[Value] [SQL_VARIANT] NULL,
[ValueInUse] [SQL_VARIANT] NULL,
[CaptureDate] [DATETIME] NULL ) ON [PRIMARY]
Решение
Как вы можете видеть из определения, которое вы предоставили для [dbo].[ConfigData], оба Value
и ValueInUse
определяются как SQL_VARIANT
типы данных.Сообщение об ошибке, которое вы получаете, является:
Сообщение 257, уровень 16, состояние 3, процедура usp_SysConfigReport1, строка 19 Неявное преобразование из типа данных sql_variant в int не разрешено.Используйте функцию CONVERT для выполнения этого запроса.
Так Value
и ValueInUse
являются SQL_VARIANT
(как и производные значения для OlderValue
, OlderValueInUse
, RecentValue
, и RecentValueInUse
) но вы хотите использовать их как INT
.
В сообщении об ошибке говорится, что вам необходимо изменить SQL_VARIANT
в INT с помощью CONVERT
функция.Пример выбора SQL_VARIANT
и превращая его в INT
.
SELECT CONVERT (int, Value) FROM [dbo].[ConfigData]
То CONVERT
изменяет тип данных (если это возможно) с SQL_VARIANT
к INT
.
Просто убедитесь, что CONVERT
к нужному типу данных, и все должно быть хорошо.