簡體   English   中英

SQL Server 2008-CAST到nvarchar無法正常工作

[英]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 (或varcharncharchar )在至少三個地方沒有長度。 不要這樣做。 默認長度因上下文而異。 所以:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM