[英]SQL Server 2008 - CAST to nvarchar not working
我將以下SQL語句作為無法工作的觸發器的一部分,無法弄清原因:
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表的列數據類型對於Sourceobject和logtype都是nvarchar(255)
對於message都是nvarchar(max)
。
問題是,當我包含CAST(@EmployeeName as nvarchar)
位時,在消息列中未輸入任何內容,並且顯示為空。 在其他兩列中輸入數據。 將employeename varchar
轉換為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語句編輯為
INSERT INTO applicationlog (Sourceobject,Logtype,Message)
values ('Orders table','Order deleted','Order with ' + CAST(@CountOfOrderItems as varchar(255)) + ' items deleted by ' + coalesce(@EmployeeName,''))
現在所有的信息都在那里,除了@Employeename我認為它返回一個空字符串,即使該雇員存在於表中。所以在最后一欄中,我現在有“ 3個項目被刪除”
哪個比以前的null好,但是@Employeename為什么為空白?
您使用的nvarchar
(或varchar
或nchar
或char
)在至少三個地方沒有長度。 不要這樣做。 默認長度因上下文而異。 所以:
DECLARE @EmployeeName NVARCHAR
是真的:
DECLARE @EmployeeName NVARCHAR(1)
和
CAST(@CountOfOrderItems as varchar)
是真的:
CAST(@CountOfOrderItems as varchar(30))
(好的,這可能還可以)。
因此,要明確長度。 您不需要將@EmployeeName
為字符串連接。 而且,您不需要使用set
因為您可以在select
語句中設置變量的值:
DECLARE @Orderid INT;
DECLARE @CountOfOrderItems INT;
DECLARE @EmployeeID INT;
DECLARE @EmployeeName NVARCHAR(255);
SELECT @Orderid = DELETED.id; -- This looks strange. I think you are missing a `from` clause
select @CountOfOrderItems = count(*)
from OrderDetails
where OrderID = @Orderid);
SELECT @EmployeeName = 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(8000)) + ' items deleted by '+ @EmployeeName ;
或者,我只是省去了所有中間步驟,然后做:
INSERT INTO applicationlog (Sourceobject, Logtype, Message)
SELECT 'Orders table', 'Order deleted',
replace(replace('Order with @n items deleted by @by',
'@n', count(od.orderid)
), '@by', e.Firstname + ' ' + e.Lastname
)
FROM deleted d JOIN
orders o
on d.id = o.orderId JOIN
employees e
on o.employeeid = e.employeeid LEFT JOIN
orderdetails od
on od.orderid = o.orderid;
我認為單個查詢可以更好地表明您正在執行的操作的意圖,並且您無需發出一堆查詢並分配變量。
看起來您在這里混用數據類型。 如果您希望它為nvarchar,則所有內容都必須為Nvarchar。 您還應該指定所需的長度,如下所示:
VALUES ('Orders table',
'Order deleted',
N'Order with ' + CAST(@CountOfOrderItems as Nvarchar(10)) + N' items deleted by '+ CAST(@EmployeeName as nvarchar(10)))
所有人都在說,我不知道為什么在已經將@EmployeeName聲明為Nvarchar的情況下將@EmployeeName轉換為Nvarchar,這似乎是一個多余的過程。
如果您的@EmployeeName為null,則整個字符串也將顯示為null,要解決此問題,可以在查詢頂部使用以下語句:
SET CONCAT_NULL_YIELDS_NULL OFF
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.