带有表值参数的存储过程

HiT*_*ech 2 sql-server stored-procedures

我正在尝试编写一个具有两个参数的存储过程。

  1. 计算机名 | 无功字符
  2. Monitor_Serial | 表值参数 (TVP)

我正在使用 TVP,因为有些计算机的显示器数量未知。

我希望我的存储过程获取 中的每个序列号,Monitor_Serial并在我的表中插入一个带有关联的新行ComputerName(正是 foreach 循环在编程中的工作方式)。

我该怎么做?当我做一些研究时,我看到几次提到使用光标,但我不确定这是否是我应该使用的。任何建议将不胜感激。

Aar*_*and 10

游标应该很少是您的第一种方法。尤其是如果您在制作表格类型时遇到了麻烦;主要目标是避免逐行处理、拆分字符串等。

对目标表、它的列以及 TVP 中列的名称进行一些猜测,您可以使用INSERT/SELECT以下命令在目标表中插入多行:

INSERT dbo.destination_table
(
  computer_name, serial_number
)
SELECT @ComputerName, column_name
  FROM @Monitor_Serial;
Run Code Online (Sandbox Code Playgroud)

要确保只插入新的序列号,请使用:

  FROM @Monitor_Serial AS m
  WHERE NOT EXISTS (SELECT 1 FROM dbo.destination_table
    WHERE serial_number = m.column_name
    -- AND computer_name = @ComputerName
  );
Run Code Online (Sandbox Code Playgroud)

(您可能需要也可能不需要该注释行,因为目前尚不清楚您是要防止整体重复还是仅防止特定计算机名称出现重复。)