У меня есть следующий SQL заявление как часть триггера, который не работает и не могу понять, почему:SQL Server 2008 - CAST для NVARCHAR не работает
DECLARE @Orderid INT
DECLARE @CountOfOrderItems INT
DECLARE @EmployeeID INT
DECLARE @EmployeeName NVARCHAR
SELECT @Orderid = DELETED.id
SET @CountOfOrderItems = (select count(*) from OrderDetails where OrderID = @Orderid)
SET @EmployeeName = (SELECT Firstname + ' ' + Lastname from Employees where employees.id =
(SELECT employeeid from Orders where Orders.id = @Orderid))
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
VALUES ('Orders table',
'Order deleted',
'Order with ' + CAST(@CountOfOrderItems as varchar) + ' items deleted by '+ CAST(@EmployeeName as nvarchar))
Типы данных столбцов для applicationlog таблицы все nvarchar(255)
для sourceobject и logtype и nvarchar(max)
для сообщения.
Проблема заключается в том, что когда я включаю бит CAST(@EmployeeName as nvarchar)
, в столбце сообщения ничего не вводится, и он показывает значение null. Данные вводятся в двух других столбцах. Также не работает литье рабочего места varchar
.
Когда я удаляю бит, выделенный выше и использующий следующий код, он работает, и выполняется кастинг для countoforderitems.
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
VALUES ('Orders table',
'Order deleted',
'Order with ' + CAST(@CountOfOrderItems as varchar) + ' items deleted')
Я понятия не имею, почему и был бы признателен за помощь, как мне нужно зарегистрировать пользователя, который удаляет запись.
Благодаря
UPDATE
Спасибо всем, что откликнулись. Я объявил employeename как VARCHAR (255) и редактировал оператора вставки в
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
values ('Orders table','Order deleted','Order with ' + CAST(@CountOfOrderItems as varchar(255)) + ' items deleted by ' + coalesce(@EmployeeName,''))
и теперь вся информация есть, кроме @Employeename, который я думаю, возвращает пустую строку, даже если работник существует в table.So в последнем столбце i теперь есть «3 элемента, удаленные«
Это лучше, чем null раньше, но почему @Employeename пустое?
@EmployeeName уже объявлен NVARCHAR, почему вы его используете? И если он равен нулю, весь ваш concat будет NULL, вам нужно сделать некоторую проверку и добавить пустую строку, если это NULL - COALESCE (@EmployeeName, '') ... Также, как упоминалось, вы должны устанавливать длину каждый раз, когда вы объявите его без длины, по умолчанию 1 –
Ваш триггер, кажется, сломан - 'deleted' - это таблица, которая может содержать 0, 1 или * несколько строк. Присвоение значений из него скалярной переменной 'SELECT @Orderid = DELETED.id' является ошибочным (если это работает даже, я бы подумал, что для этого запроса вам еще нужно предложение' FROM'). –
Damien - я понимаю, что триггер запускается, когда запись, т.е. одна строка удалена? Пожалуйста, исправьте меня, если я ошибаюсь. и да, SELECT @orderid действительно возвращает значение, и синтаксис выглядел нечетным, но здесь есть другие триггеры, которые используют его и работают fine.cheers – Nick