遍历表并选择100行,然后选择下100行。

时间:2020-11-08 20:29:59

标签: sql sql-server

我在SQL Server中有一个表,其中包含项的ID,并且它们在该表中不是唯一的。我正在尝试将其传递给openquery,以便从oracle获取这些项目的其他信息。

该表一次可以有5000-17000行。我尝试将该列的所有行转换为逗号分隔的字符串,然后将其传递给打开的查询

declare @results varchar(max)

set @results = (select stuff([list],1,3,'') as stuff_list
                from (select '''''' + ',' + '''''' + cast(itemId as varchar(10)) as [text()]
                      from ItemTable sub
                      order by itemId asc
                      for xml path('')) sub_query([list]) )

然后将其传递给openquery

DECLARE @SQL varchar(max)

SET @SQL = @SQL + 'SELECT * FROM OPENQUERY(op, ''SELECT * FROM ITEM_INFO WHERE ITEM_CODE IN('+@results+')'')'

--SET @SQL = @SQL + 'WHERE ITEM_CODE IN(' + @results  +')'

EXEC (@SQL)

我得到:

以“ SELECT * FROM .....”开头的字符串太长。最大长度为8000。

所以我想我也许可以遍历表并一次选择100行,然后将其传递给打开的查询,依此类推。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以利用EXEC AT [LinkedServer]克服8000个字符的限制。

这里的数据类型是MAX数据类型,因此您没有8000个字符的问题。

EXEC at MSDN

@string_variable是局部变量的名称。 @string_variable可以 是任何char,varchar,nchar或nvarchar数据类型。这些包括 (最大)数据类型。

DECLARE @SQL varchar(max)

SET @SQL = 'SELECT * FROM ITEM_INFO WHERE ITEM_CODE IN('+@results+')'

EXEC (@SQL) AT op

参考