如何在SQL Server中将数字转换为nvarchar?

时间:2019-05-06 01:16:16

标签: sql sql-server tsql triggers calculated-columns

请参阅下表。我使用触发器添加到表中。在将数字转换为字符串的列中,失败。

WARNING:root:I am a SmartLogRecord
WARNING:root:I am a {1: 'variable'}

3 个答案:

答案 0 :(得分:5)

您在这里遇到一些问题:

@@IDENTITY 是一个系统函数,包含当INSERTSELECT INTOBULK COPY语句为完成。如果该语句不影响任何带有标识列的表,则@@IDENTITY返回NULL。如果插入了多个行,生成了多个标识值,则@@IDENTITY返回最后生成的标识值。

在您的情况下,您有一个INSTEAD OF INSERT触发器,因此没有INSERT

下面的查询是完全错误的,并且将给出错误的结果,仅当插入一行时,它才能按预期工作;如果多于1行,则这些变量将仅保留一行的值,并且您将丢失其他行的其他值,导致伪INSERTED可能包含1个或更多行

select @AgentCode=AgentCode,
       @NationalCode=NationalCode,
       @FirstName=FirstName,
       @LastName=LastName,
       @IsActive=IsActive 
from inserted

现在,查看表,您已经有一个IDENTITY列,因此根本不需要TRIGGER,您只需将计算列设为

CREATE TABLE [dbo].[tblAIAgent](
    [AgentCode] AS 'Agent_' + CAST([Counter] AS VARCHAR(10)),
    [NationalCode] [bigint] NOT NULL 
    CONSTRAINT [DF_tblAIAgent_NationalCode]  DEFAULT ((0)),
    [FirstName] [nvarchar](50) NOT NULL 
    CONSTRAINT [DF_tblAIAgent_Name]  DEFAULT (''),
    [LastName] [nvarchar](50) NOT NULL 
    CONSTRAINT [DF_tblAIAgent_Family]  DEFAULT (''),
    [IsActive] [bit] NOT NULL 
    CONSTRAINT [DF_tblAIAgent_Active]  DEFAULT ((1)),
    [Counter] [int] IDENTITY(1,1) NOT NULL,
    CONSTRAINT [PK_tblAIAgent] PRIMARY KEY ([Counter])
    );

更新:

根据您的注释“,无法再将计算列选作PK。我希望将此列作为FK放在其他相关表中。我编写了触发器来获取列值,而不是计算列,以便我可以选择该列作为主键”。您正在尝试将其设置为PRIMARY KEY,以便您可以这样做

CREATE TABLE T(
  Counter INT IDENTITY(1,1) NOT NULL,
  OtherCol INT,
  Computed AS CONCAT('Agent_', CAST(Counter AS VARCHAR(10))) PERSISTED,
  CONSTRAINT PKT PRIMARY KEY(Computed)
);

CREATE TABLE TT(
  ReferenceComputedColumn VARCHAR(16) NOT NULL,
  OtherColumn INT,
  CONSTRAINT FK_ReferencedComputedColumn 
      FOREIGN KEY(ReferenceComputedColumn) 
      REFERENCES T(Computed)
)

INSERT INTO T(OtherCol) VALUES
(1), (2), (3);

INSERT INTO TT(ReferenceComputedColumn, OtherColumn) VALUES
('Agent_1', 10),
('Agent_3', 20);

SELECT *
FROM T LEFT JOIN TT 
ON T.Computed = TT.ReferenceComputedColumn;

See how it's working

另请参阅 Properly Persisted Computed Columns 的这篇文章 Paul White

答案 1 :(得分:2)

尝试一下

new_file_name

答案 2 :(得分:2)

SELECT CAST([PictureId] AS NVARCHAR(4)) From Category