Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在表格中循环选择100行,然后选择下100行..以此类推_Sql_Sql Server - Fatal编程技术网

Sql 在表格中循环选择100行,然后选择下100行..以此类推

Sql 在表格中循环选择100行,然后选择下100行..以此类推,sql,sql-server,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 (se

我在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行,然后将其传递给打开的查询,以此类推。实现这一点的最佳方法是什么?

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

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

@string_variable是局部变量的名称@字符串_变量可以 可以是任何char、varchar、nchar或nvarchar数据类型。其中包括 (最大)数据类型

DECLARE@SQL varchar(最大值)
SET@SQL='SELECT*FROM ITEM_INFO,其中ITEM_编码在('+@results+')中
执行(@SQL)操作
参考资料

  • 还可以动态传递参数


如果您谈论的是SQL Server,那么
plsql
标记实际上不属于这里。PL/SQL是Oracle过程SQL语言的“方言”……表没有“记录”;它们有行和列。请始终在标记中指定版本。如果这是SQL Server的早期版本,则可以使用offset_fetch。在某些时候,您最好只运行
SELECT*FROM ITEM\u INFO
并在SQL Server端进行筛选。