Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server触发器根据上述文件名和值填充空值_Sql_Sql Server_Triggers_Sql Update - Fatal编程技术网

SQL Server触发器根据上述文件名和值填充空值

SQL Server触发器根据上述文件名和值填充空值,sql,sql-server,triggers,sql-update,Sql,Sql Server,Triggers,Sql Update,我需要创建一个触发器来帮助我填写项目名称列的其余部分。项目名称来自“我的主机名”列,但在导入时可能有多组主机名。我的当前触发器允许我填写项目栏,如下所示: 当前触发结果: 我需要更新触发器,以便它填充其余的空值,并用相应的主机名填充项目名称 期望的触发结果: 我需要这个触发器动态工作,所以它将在导入时填充任意数量的行和项目。我还想使用文件名作为更新的标准,这样它就不会意外地更新任何其他导入的数据集 当前触发代码: 这是我的当前触发器,它允许我获取项目名称 CREATE TRIGGER [tr

我需要创建一个触发器来帮助我填写项目名称列的其余部分。项目名称来自“我的主机名”列,但在导入时可能有多组主机名。我的当前触发器允许我填写项目栏,如下所示:

当前触发结果:

我需要更新触发器,以便它填充其余的空值,并用相应的主机名填充项目名称

期望的触发结果:

我需要这个触发器动态工作,所以它将在导入时填充任意数量的行和项目。我还想使用文件名作为更新的标准,这样它就不会意外地更新任何其他导入的数据集

当前触发代码:
这是我的当前触发器,它允许我获取项目名称

CREATE TRIGGER [trgUpdateProject]
ON [myTable]
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

UPDATE m
SET m.[Project] = m.[Host name]
FROM inserted i
JOIN [myTable] m ON i.[FileName] = m.[FileName]
WHERE UPPER(m.[Mfg]) IN (SELECT UPPER([Mfg_ID]) FROM [tblMfg_ID]) 
and m.[Project] IS NULL

END

假设RowID是表的主键

CREATE TRIGGER [trgUpdateProject]
ON [myTable]
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

UPDATE m
SET    m.[Project] = n.[Host name]
FROM   inserted i
       INNER JOIN [myTable]   m  ON i.RowID = m.RowID
       INNER JOIN [tblMfg_ID] n  ON m.Mfg   = n.Mfg_ID
WHERE  i.[Project] IS NULL

END

请尝试使用下面的查询以获得所需的结果

如果表格采用下表形式

create table updproject(
rowid varchar(20) not null unique,
filename varchar(20),
project varchar(20),
hostname varchar(20),
)
 insert into updproject (rowid,filename,hostname) values ('abc123', 'abc1' ,'HostN-012')
使用下面的触发器根据主机名更新项目

CREATE TRIGGER [trgUpdateProject]
ON updproject
FOR INSERT,update
AS
BEGIN
SET NOCOUNT ON;
DECLARE  @st1 varchar(5)
SELECT @st1 = SUBSTRING(hostname,CHARINDEX('t',hostname)+1,1) from inserted
UPDATE updproject
SET updproject.Project = 'Host'+@st1
where rowid = (select rowid from inserted) and project is null
END
请尝试在下表中插入一行

create table updproject(
rowid varchar(20) not null unique,
filename varchar(20),
project varchar(20),
hostname varchar(20),
)
 insert into updproject (rowid,filename,hostname) values ('abc123', 'abc1' ,'HostN-012')
输出:

rowid filename project hostname
abc123 abc1    HostN   HostN-012

你能给我们看看你现在的扳机吗?当然可以。只需补充一点,您可以向我们显示
m.[Mfg]
的数据,并从[tblMfg_ID]中选择上限([Mfg_ID])?首先,“上面的值”注释需要一个正确的排序表达式-顺序ID,或日期/时间或其他可以排序数据的东西,以便您可以拥有“上面的值”(或上一个/下一个值)第二:你没有使用触发器中的
Inserted
伪表,它保存了新插入的行-你总是更新整个表,这在一段时间后会非常慢。不幸的是,其中一些数据是敏感的,这就是为什么我没有包含任何数据的原因。基本上,这是一个已知制造商的映射与用于项目名称的主机名相对应的URER。如果[project]为空,则将执行查询(更新),否则它不会更新,因此我删除了“project为空”命令。我发布的触发器代码用于当前使用的触发器,用相应的主机名填充项目名称。我的问题是用正确的项目名称填充空值。类似的操作可能会起作用。我明天将测试它。感谢加入mfg,它将生成与项目所在行相同的行已在
WHERE
子句中填写,将排除我感谢您的努力,但示例中提供的主机名只是一个占位符。主机名可以命名为任何名称,但不总是指定一定数量的字符。感谢您的更新。主机名列中是否会有类似%Host%的字符串?