我在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行,然后将其传递给打开的查询,依此类推。最好的方法是什么?
答案 0 :(得分:0)
您可以利用EXEC AT [LinkedServer]克服8000个字符的限制。
这里的数据类型是MAX数据类型,因此您没有8000个字符的问题。
@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
参考
您还可以动态传递参数。 More info