php - 将 SELECT 语句结果传递给 StoredProc 以进行临时表连接
问题描述
我正在尝试从 DB-Server-1 中的一个表中获取数据,并将其传递给正在 DB-SERVER-2 上执行的 StoredProcedure(从 DB-Server-1 连接到此数据)。
所以,我在不同的服务器上有 2 个表:
DB-Server-1:tblItem
------------------- item_id | item_qty ------------------- 1231 | 2 1232 | 4 -------------------
DB-Server-2:tblItemDetails
---------------------------------------- item_detail_id | item_id | item_data ---------------------------------------- 1 | 1231 | TEST_DATA_1 2 | 1232 | TEST_DATA_2 ----------------------------------------
现在我想从 DB-Server-1 获取数据(基本选择查询)
SELECT item_id, item_qty
FROM tblItem
WHERE item_id IN (1231, 1232);
并将其传递给存储过程:spSetItemQuantityInItemDetails
CREATE PROCEDURE [dbo].[spUpdatePOCartons]
(
@valueList VARCHAR(MAX)
)
.
.
-- Now trying to split string and create a temp table
-- This temp table will later be used in the SP to join with tblItemDetails to set item_qty
DECLARE @temp TABLE (
item_id int,
item_qty int
);
DECLARE @pos1 INT
DECLARE @len1 INT
DECLARE @value1 varchar(8000)
DECLARE @pos2 INT
DECLARE @len2 INT
DECLARE @value2 varchar(8000)
SET @valueList = '1,4;2,5;3,14;';
set @pos1 = 0
set @len1 = 0
WHILE CHARINDEX(';', @valueList, @pos1+1)>0
BEGIN
set @len1 = CHARINDEX(';', @valueList, @pos1+1) - @pos1
set @value1 = SUBSTRING(@valueList, @pos1, @len1)
--SELECT @pos, @len, @value /*this is here for debugging*/
PRINT @value1;
-----------
set @pos2 = 0
set @len2 = 0
WHILE CHARINDEX(',', @value1, @pos2+1)>0
BEGIN
set @len2 = CHARINDEX(',', @value1, @pos2+1) - @pos2
set @value2 = SUBSTRING(@value1, @pos2, @len2)
--SELECT @pos, @len, @value /*this is here for debugging*/
PRINT @value2;
set @pos2 = CHARINDEX(',', @value1, @pos2+@len2) +1
END
------------
set @pos1 = CHARINDEX(';', @valueList, @pos1+@len1) +1
END
问题
我试图了解上述解决方案是否最接近可行的方法(目前它不会拆分不以 ; 或 , 结尾的字符串的最后一个值)或者是否有更好的方法
解决方案
我认为更好的方法可能是将表变量直接传递给存储过程。为此,您必须创建一个为输入表创建结构的类型。我在下面重新创建了这个场景。让我知道您是否可以使用它来实现您的目标。
--Create test tables
CREATE TABLE dbo.tblItem (item_id int, item_qty int);
CREATE TABLE dbo.tblItem2 (item_detail_id int, item_id int, item_details varchar(50));
GO
--Create the type that can be used as input
CREATE TYPE TableForInput as TABLE
(
Item_Id int,
Item_Qty int
);
GO
--Create/alter the stored procedure
CREATE PROCEDURE dbo.usp_GetCardData
@Input TableForInput READONLY
AS
BEGIN
SELECT * FROM dbo.tblItem2 as t2 INNER JOIN @Input as i ON t2.Item_id = i.Item_id
END
GO
--Insert dummy data into the test tables
INSERT INTO dbo.tblItem values (1231, 2), (1232, 4);
INSERT INTO dbo.tblItem2 VALUES (1, 1231, 'TEST_1'), (2, 1232, 'TEST2')
-- The below would mimic the client side.
-- Declare a local temporary table, select data into it
-- And then pass this as a parameter to the stored proc
DECLARE @Data TableForInput;
INSERT INTO @Data
SELECT * FROM dbo.tblItem;
exec dbo.usp_GetCardData @Data
推荐阅读
- flutter - Flutter:更新滚动视图物理而不重建
- iframe - iframe 为 Grafana 显示“拒绝连接”
- java - 如何在正则表达式 Jlex 中选择特定单词?
- mysql - 将字符串从 MySQL 转换为 JSON,意外的令牌 N
- reactjs - React.js:登录时如何获取并显示当前用户?
- python - 从 Cygwin 扫描 Windows 中的驱动器
- macos - 为什么 /usr/libexec/java_home 不打印任何内容?
- python - Python Pandas:使用 apply 方法从另一个数据框中更新多个列值
- c++ - 如何检测和处理算法中不受支持的语言环境?
- batch-file - 我正在尝试编写一个批处理命令以在工作区中自动运行 VSCode,但是当我关闭 CMD 时,VSCode 也会关闭