У меня есть таблица, которая отслеживает вставки, обновления и удаления в другую таблицу. Этот шаблон использовался годами, но внезапно привел к ошибке, когда мы добавили отслеживание столбца DATE
.
Это не проблема формата строки. Мои входные данные в стандартном формате ISO-8601.
Я вырезал все, кроме необходимых частей кода, чтобы продемонстрировать проблему.
CREATE TABLE dbo.ChangeTrackingTable
(
oldValue VARCHAR(100) NULL,
newValue VARCHAR(100) NULL
);
GO
CREATE PROCEDURE dbo.usp_TestProcedure
(
@name VARCHAR(100),
@dateOfBirth DATE
)
AS
BEGIN
INSERT INTO dbo.ChangeTrackingTable
(
oldValue,
newValue
)
SELECT
List.oldFieldValue,
List.newFieldValue
FROM
(VALUES
(NULL, @name, IIF(@name IS NOT NULL, 1, 0)),
(NULL, @dateOfBirth, IIF(@dateOfBirth IS NOT NULL, 1, 0))
) AS List (oldFieldValue, newFieldValue, hasChanges)
WHERE
List.hasChanges = 1
END;
GO
Список VALUES
используется для динамического определения, какие столбцы касаются.
Когда я выполняю sproc только с датой, все работает нормально.
DECLARE @date DATE = GETDATE();
EXEC dbo.usp_TestProcedure
@name = NULL,
@dateOfBirth = @date;
/*
oldValue newValue
NULL 2019-03-27
*/
Но если я попытаюсь выполнить его с любым значением, указанным для @name
, независимо от того, указано или нет значение для @date
, я получу следующую ошибку.
DECLARE @date DATE = GETDATE();
EXEC dbo.usp_TestProcedure
@name = 'Name',
@dateOfBirth = @date;
--Conversion failed when converting date and/or time from character string.
Если я передаю жестко закодированные значения непосредственно в оператор INSERT
, он работает нормально. Так что я могу знать, что это не происходит на уровне таблицы при вставке.
Если я добавлю явное приведение к этой строке
(NULL, CAST(@dateOfBirth AS VARCHAR(100)), IIF(@dateOfBirth IS NOT NULL, 1, 0))
это также работает.
Проблема возникает также с типами DATETIMEOFFSET
, DATETIME
и DATETIME2
, поэтому мое использование DATE
не является проблемой.
У меня вопрос, почему я получаю ошибку преобразования string > datetime
, когда пытаюсь прочитать значение DATE
для вставки в столбец VARCHAR
, но только в список VALUES
, если существует другой ненулевое значение в наборе результатов для List
?