我正试图从db-server-1中的一个表中获取数据,并将其传递给db-server-2上正在执行的storedprocesdure(它从db-server-1连接到此数据)。
所以,我在不同的服务器上有两个表:
db-server-1:待定
-------------------
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(basic select query)获取数据
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
发行
我试图了解上述解决方案是否最接近实际情况(目前它没有拆分字符串的最后一个值,该值不以结尾;或者,)或者有更好的方法吗
2条答案
按热度按时间lyr7nygr1#
我认为更好的方法可能是将表变量直接传递给存储过程。为此,必须创建一个为输入表创建结构的类型。我在下面重新创建了这个场景。让我知道你是否可以通过这个来实现你的目标。
2jcobegt2#
谢谢大家。你的见解真的有助于解决问题。我可以通过以下方式获得预期的行为: