OPENQUERY访问链接服务器字符超8000,如何创建视图?
解决OPENQUERY长语句超8000字符的报错问题
解决这个问题有几种实用方法,根据你的实际场景选择:
方案1:在链接服务器上创建存储过程调用
把你的超长SELECT语句封装成链接服务器(MyServerLink)对应数据库里的存储过程,这样调用时传递的字符串就会很短:-- 先在MyServerLink的目标数据库里执行这段代码创建存储过程 CREATE PROCEDURE dbo.GetLongQueryData AS BEGIN -- 这里直接放你那超长的SELECT语句 LONGSELECTQUERY END然后回到本地服务器创建视图:
CREATE VIEW [dbo].[test] AS SELECT * FROM OPENQUERY([MyServerLink], 'EXEC dbo.GetLongQueryData');方案2:用OPENROWSET+动态拼接(无法创建存储时用)
如果没法在链接服务器上建存储过程,可以把长查询拆成多个片段拼接成NVARCHAR(MAX)类型的字符串,再通过OPENROWSET执行。要是想在视图里用,可以先整个表值函数:-- 先创建表值函数 CREATE FUNCTION dbo.GetLongQueryData() RETURNS TABLE AS RETURN ( DECLARE @sql NVARCHAR(MAX); -- 把长查询拆成片段拼接,避免单段超过限制 SET @sql = N'第一段查询内容' + N'第二段查询内容' + N'...剩下的查询片段'; -- 通过OPENROWSET执行远程查询 SELECT * FROM OPENROWSET('SQLNCLI', 'Server=MyServerLink;Trusted_Connection=yes;', @sql); ) -- 再创建视图 CREATE VIEW [dbo].[test] AS SELECT * FROM dbo.GetLongQueryData();注意这种方式需要先启用Ad Hoc Distributed Queries配置:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;方案3:用sp_executesql远程执行(固定结果结构时用)
要是你清楚远程查询返回的列结构,还可以用sp_executesql在链接服务器上执行长语句,结合临时表返回结果:-- 创建表值函数 CREATE FUNCTION dbo.GetLongQueryData() RETURNS TABLE AS RETURN ( DECLARE @sql NVARCHAR(MAX); SET @sql = N'你的超长SELECT语句'; DECLARE @linkedServer NVARCHAR(128) = N'MyServerLink'; -- 定义和查询结果匹配的临时表结构 DECLARE @temp TABLE ( Col1 INT, Col2 VARCHAR(100), -- 按实际结果添加所有列 ... ); -- 替换语句里的单引号避免语法错误,然后远程执行插入临时表 INSERT INTO @temp EXEC (@linkedServer + N'.sys.sp_executesql @statement = ''' + REPLACE(@sql, '''', '''''') + ''''); SELECT * FROM @temp; ) -- 创建视图 CREATE VIEW [dbo].[test] AS SELECT * FROM dbo.GetLongQueryData();
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

