关于把链接服务器的查询结果放入表变量的问题

xiaoxinghappy 2011-10-27 03:16:00
假设有链接服务器B,服务器B上有 db 数据库



DECLARE @tempTable TABLE(F_Name NVARCHAR(50))

-- 查询数据放入本地表变量

-- 第一句会出错
INSERT INTO @tempTable exec B.db.dbo.sp_executesql N'select distinct f_name from t'

--第二句正常
INSERT INTO @tempTable exec sp_executesql N'select distinct f_name from B.db.dbo.t'

SELECT * FROM @tempTable


为什么第一句会出错呢?
提示错误“没有活动的事务”
...全文
60 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
SQL SERVER 2005的
中国风 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaoxinghappy 的回复:]

引用 7 楼 roy_88 的回复:

用AT連接
SQL code
-- 第一句会出错
INSERT INTO @tempTable exec B.db.dbo.sp_executesql N'select distinct f_name from t'

--改為

INSERT INTO @tempTable EXECUTE ('select distinct f_nam……
[/Quote]

SQL Server是什麼版本?2000
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
这样子为什么会不行呢,原因是什么,这里为什么会提示没有活动事务呢?
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
已经做好了连接服务器了啊,不需要再做数据源的方式打开远程数据库了
面且,其实我的链接服务器名是动态传入的,可以变,也可以没有
[code=SQL]
DECLARE @tempTable TABLE(F_Name NVARCHAR(50))
DECLARE @exec NVARCHAR(4000)
DECLARE @SQL NVARCHAR(4000)
-- 这里当链接服务器名改变时,也会改变,如果没有就取本地表了
SET @EXEC='exec ascenter.mkcenter.dbo.sp_executesql @sql'
set @sql='SELECT DISTINCT F_DishTypeMain FROM V_BillByDishType WHERE NOT F_DishTypeMain IS NULL'
INSERT INTO @tempTable EXEC sp_executesql @exec, N'@sql NVARCHAR(4000)', @SQL
SELECT * FROM @tempTable
[/CODE]
zlp321002 2011-10-27
  • 打赏
  • 举报
回复
如果是表的话,参考:

create table #t(a varchar(20))
insert into #t (a)
SELECT 字段 FROM OPENROWSET('SQLNCLI', 'Server=远程IP;Uid=sa;Pwd=pwd',
'select * from dbname.dbo.tablename where ...') AS a;
go
select * from #t
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 roy_88 的回复:]

用AT連接
SQL code
-- 第一句会出错
INSERT INTO @tempTable exec B.db.dbo.sp_executesql N'select distinct f_name from t'

--改為

INSERT INTO @tempTable EXECUTE ('select distinct f_name from db.dbo.t') AT B;
[/Quote]

会出现同样的错误提示
中国风 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaoxinghappy 的回复:]

这两句话的不同点,我个人理解的意思是,
第一句调用远程服务器上的存储过程执行SQL语句
第二句调用本地服务器上的存储过程执行SQL语句查询远程服务器上的数据
[/Quote]

參照7樓的方法和11樓方法
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
这两句话的不同点,我个人理解的意思是,
第一句调用远程服务器上的存储过程执行SQL语句
第二句调用本地服务器上的存储过程执行SQL语句查询远程服务器上的数据
中国风 2011-10-27
  • 打赏
  • 举报
回复
SQL2005以上用AT同樣支持傳參用法
zlp321002 2011-10-27
  • 打赏
  • 举报
回复
declare @a varchar(20)

SELECT @a=groupname
FROM OPENROWSET('SQLNCLI', 'Server=远程IP;Uid=sa;Pwd=pwd',
'select * from dbname.dbo.tablename where ...') AS a;
select @a
中国风 2011-10-27
  • 打赏
  • 举报
回复
用AT連接
-- 第一句会出错
INSERT INTO @tempTable exec B.db.dbo.sp_executesql N'select distinct f_name from t'

--改為

INSERT INTO @tempTable EXECUTE ('select distinct f_name from db.dbo.t') AT B;
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 roy_88 的回复:]

use [db]
go
--T表在DB在這實例上?
[/Quote]

是的,T 表就db的实例上
中国风 2011-10-27
  • 打赏
  • 举报
回复
use [db]
go
--T表在DB在這實例上?
DECLARE        @tempTable        TABLE(F_Name NVARCHAR(50))

-- 查询数据放入本地表变量

-- 第一句会出错
INSERT INTO @tempTable exec B.db.dbo.sp_executesql N'select distinct f_name from t'
xiaoxinghappy 2011-10-27
  • 打赏
  • 举报
回复
下面这样是正常的
exec B.db.dbo.sp_executesql N'select distinct f_name from t'

就是不加 Insert Into
中国风 2011-10-27
  • 打赏
  • 举报
回复
執行環境非B庫
昵称被占用了 2011-10-27
  • 打赏
  • 举报
回复
sp_executesql 是master库的系统存储过程,调用本地的就可以了
-晴天 2011-10-27
  • 打赏
  • 举报
回复
因为
dbo.sp_executesql
不是B的,
而是你的.

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧