SQL Server 2014 多次执行存储过程并插入 table 包括参数
SQL Server 2014 execute stored procedure multiple times and Insert into table including parameter
我有一个获取两个参数的存储过程,Date
和 EquipName
并且结果集未存储在 table.
中
我想做的是 运行 存储过程多次 EquipName
和每个结果集 INSERT
只变成一个 table (MyTable
).
存储过程的结果有 30 行。
为此,我使用以下代码。
感谢this Link
DECLARE @EquipName INT
DECLARE curs CURSOR LOCAL FAST_FORWARD FOR
SELECT EquipName
FROM EquipTable
WHERE ...
OPEN curs
FETCH NEXT FROM curs INTO @EquipName
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO MyTable
EXEC sp_storeProc '2018-01-01', @EquipName
FETCH NEXT FROM curs INTO @EquipName
END
CLOSE curs
DEALLOCATE curs
我的问题是:
比方说,存储过程结果有 5 列,但 MyTable
有 一个额外的列 NameOfEquip
,对于存储过程中的每个结果集, 将 @EquipName
插入该结果集的所有 30 行。
我该怎么做? MyTable
已使用正确的架构创建。
每次插入 table 后,尝试为所有 NULL 值更新 NameOfEquip
。也许是这样的
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO MyTable
EXEC sp_storeProc '2018-01-01', @EquipName
UPDATE MyTable SET NameOfEquip = ISNULL(@EquipName,'') WHERE NameOfEquip IS NULL
FETCH NEXT FROM curs INTO @EquipName
END
您可以将存储过程的结果插入到临时文件 table 中,然后从临时文件 table 中读取额外的列并插入到 'MyTable' 中。
像这样:
DECLARE @TempTable TABLE (ColA INT, ColB INT)
INSERT INTO @TempTable
EXEC sp_storeProc '2018-01-01', @EquipName
INSERT INTO MyTable
SELECT *, @EquipName FROM @TempTable
您也可以使用 OPENROWSET
实现此目的。您可以找到有关此 here
的更多详细信息
以下是相同的示例。
例如你有如下SP。
CREATE PROCEDURE TEST
(
@INPUT1 VARCHAR(10),
@INPUT2 VARCHAR(20)
)
AS
BEGIN
SELECT @INPUT1 AS COL1, @INPUT2 AS COL2
END
如果直接执行SP
EXECUTE TEST 'A','B'
您将得到如下输出。
COL1 COL2
------ ------
A B
要向结果附加一个额外的参数,您可以尝试如下操作。
DECLARE @TBL TABLE(COL1 VARCHAR(10), COL2 VARCHAR(10), COL3 DATETIME)
INSERT INTO @TBL(COL1,COL2,COL3)
SELECT A.*,GETDATE()
from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;',
'EXECUTE TEST ''A'',''B''') AS A
SELECT * FROM @TBL
输出:
COL1 COL2 COL3
A B 2018-02-21 09:09:03.257
我有一个获取两个参数的存储过程,Date
和 EquipName
并且结果集未存储在 table.
我想做的是 运行 存储过程多次 EquipName
和每个结果集 INSERT
只变成一个 table (MyTable
).
存储过程的结果有 30 行。
为此,我使用以下代码。
感谢this Link
DECLARE @EquipName INT
DECLARE curs CURSOR LOCAL FAST_FORWARD FOR
SELECT EquipName
FROM EquipTable
WHERE ...
OPEN curs
FETCH NEXT FROM curs INTO @EquipName
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO MyTable
EXEC sp_storeProc '2018-01-01', @EquipName
FETCH NEXT FROM curs INTO @EquipName
END
CLOSE curs
DEALLOCATE curs
我的问题是:
比方说,存储过程结果有 5 列,但 MyTable
有 一个额外的列 NameOfEquip
,对于存储过程中的每个结果集, 将 @EquipName
插入该结果集的所有 30 行。
我该怎么做? MyTable
已使用正确的架构创建。
每次插入 table 后,尝试为所有 NULL 值更新 NameOfEquip
。也许是这样的
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO MyTable
EXEC sp_storeProc '2018-01-01', @EquipName
UPDATE MyTable SET NameOfEquip = ISNULL(@EquipName,'') WHERE NameOfEquip IS NULL
FETCH NEXT FROM curs INTO @EquipName
END
您可以将存储过程的结果插入到临时文件 table 中,然后从临时文件 table 中读取额外的列并插入到 'MyTable' 中。 像这样:
DECLARE @TempTable TABLE (ColA INT, ColB INT)
INSERT INTO @TempTable
EXEC sp_storeProc '2018-01-01', @EquipName
INSERT INTO MyTable
SELECT *, @EquipName FROM @TempTable
您也可以使用 OPENROWSET
实现此目的。您可以找到有关此 here
以下是相同的示例。
例如你有如下SP。
CREATE PROCEDURE TEST
(
@INPUT1 VARCHAR(10),
@INPUT2 VARCHAR(20)
)
AS
BEGIN
SELECT @INPUT1 AS COL1, @INPUT2 AS COL2
END
如果直接执行SP
EXECUTE TEST 'A','B'
您将得到如下输出。
COL1 COL2
------ ------
A B
要向结果附加一个额外的参数,您可以尝试如下操作。
DECLARE @TBL TABLE(COL1 VARCHAR(10), COL2 VARCHAR(10), COL3 DATETIME)
INSERT INTO @TBL(COL1,COL2,COL3)
SELECT A.*,GETDATE()
from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;',
'EXECUTE TEST ''A'',''B''') AS A
SELECT * FROM @TBL
输出:
COL1 COL2 COL3
A B 2018-02-21 09:09:03.257