Вопрос

Я создал хранимую процедуру, которую я получил на курсе Эрин Стеллато по 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 к нужному типу данных, и все должно быть хорошо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top