sqlserver 通过链接服务器创建视图提示对象名无效

背景:
1、创建的视图不在本机电脑上,而是在链接服务器上
2、创建的方式为命令方式
3、创建的命令是将SQL语句进行了拼接,然后在存储过程中执行

问题描述:
单独将SQL语句拉出来是可以正常创建视图的,但能过存储过程执行命令创建时,却提示“XXX对象名无效”。
在网上找了一下资料,大部分没什么参价值。但有一份资料却让我发出了此次的问题所在。

    拼接的代码 如下:
    参数说明 :@lineInfo 链接服务器名称
            @Sql 是NVARCHAR(MAX)类型的数据,用以保存拼接的字符串。
-- 创建视图
    set @Sql = N' exec sp_executesql N'''; 
    set @Sql = @Sql + N'CREATE VIEW [dbo].[details]';
    set @Sql = @Sql + N'    AS';
    set @Sql = @Sql + N'    SELECT     TOP (100) PERCENT CONVERT(char(10), A.Date, 120) AS 日期, A.XX , ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, CONVERT(varchar(10), ';
    set @Sql = @Sql + N' A.GETDATE(), 108) AS 现在时间, A.xx, ';
    set @Sql = @Sql + N' B.XX, B.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX';
    set @Sql = @Sql + N'    FROM         dbo.Detail A LEFT OUTER JOIN';
    set @Sql = @Sql + N' dbo.Style B ON A.XX= B.XXAND ';
    set @Sql = @Sql + N' A.XX= B.XX';
    set @Sql = @Sql + N'    WHERE     (A.XX> 0)';
    set @Sql = @Sql + N'    UNION ALL';
    set @Sql = @Sql + N'    SELECT     TOP (100) PERCENT CONVERT(char(10), A.Date, 120) AS 日期, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, B.XX, CONVERT(varchar(10), ';
    set @Sql = @Sql + N' A.GETDATE(), 108) AS 现在时间, ''''XX'''' AS XX, ';
    set @Sql = @Sql + N' cast(round(B.price * (1.0*A.Num/b.unit),2) as decimal(18,2)) AS XX, B.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX';
    set @Sql = @Sql + N'    FROM         dbo.Manual A LEFT OUTER JOIN';
    set @Sql = @Sql + N' dbo.List B ON A.XX= B.XXAND ';
    set @Sql = @Sql + N' A.XX= B.uuid';
    set @Sql = @Sql + N'    WHERE A.XX= 1';
    set @Sql = @Sql + N'    and     (A.XX> 0)';
    set @Sql = @Sql + N'    ORDER BY XX, XX, XX, XX''';

问题原因:未明确指定数据库,因为是直接通过链接服务器远程执行的命令,所以它默认是在MASTER数据库下的,而在此数据库下,并没有创建视图所须要的表,所以会报 ‘对象名无效’的错误。

修改位置:
1:
set @Sql = N’ exec sp_executesql N”’;
改为:
set @Sql = N’ exec ‘+@lineInfo+’.dbManage.sys.sp_executesql N”’;

2:
set @Sql = @Sql + N’ FROM dbo.Detail A LEFT OUTER JOIN’;
set @Sql = @Sql + N’ dbo.Style B ON A.XX= B.XXAND ‘;
改为:
set @Sql = @Sql + N’ FROM dbManage.dbo.Manual A LEFT OUTER JOIN’;
set @Sql = @Sql + N’ dbManage.dbo.List B ON A.XX= B.XXAND ‘;

3:
set @Sql = @Sql + N’ FROM dbo.Manual A LEFT OUTER JOIN’;
set @Sql = @Sql + N’ dbo.List B ON A.XX= B.XXAND ‘;
改为:
set @Sql = @Sql + N’ FROM dbManage.dbo.Manual A LEFT OUTER JOIN’;
set @Sql = @Sql + N’ dbManage.dbo.List B ON A.XX= B.XXAND ‘;

修改完成后的代码如下:

-- 创建视图
    set @Sql = N' exec '+@lineInfo+'.dbManage.sys.sp_executesql N'''; 
    set @Sql = @Sql + N'CREATE VIEW [dbo].[details]';
    set @Sql = @Sql + N'    AS';
    set @Sql = @Sql + N'    SELECT     TOP (100) PERCENT CONVERT(char(10), A.Date, 120) AS 日期, A.XX , ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, CONVERT(varchar(10), ';
    set @Sql = @Sql + N' A.GETDATE(), 108) AS 现在时间, A.xx, ';
    set @Sql = @Sql + N' B.XX, B.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX';
    set @Sql = @Sql + N'    FROM         dbManage.dbo.Detail A LEFT OUTER JOIN';
    set @Sql = @Sql + N' dbManage.dbo.Style B ON A.XX= B.XXAND ';
    set @Sql = @Sql + N' A.XX= B.XX';
    set @Sql = @Sql + N'    WHERE     (A.XX> 0)';
    set @Sql = @Sql + N'    UNION ALL';
    set @Sql = @Sql + N'    SELECT     TOP (100) PERCENT CONVERT(char(10), A.Date, 120) AS 日期, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, B.XX, CONVERT(varchar(10), ';
    set @Sql = @Sql + N' A.GETDATE(), 108) AS 现在时间, ''''XX'''' AS XX, ';
    set @Sql = @Sql + N' cast(round(B.price * (1.0*A.Num/b.unit),2) as decimal(18,2)) AS XX, B.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX, A.XX, ';
    set @Sql = @Sql + N' A.XX, A.XX';
    set @Sql = @Sql + N'    FROM         dbManage.dbo.Manual A LEFT OUTER JOIN';
    set @Sql = @Sql + N' dbManage.dbo.List B ON A.XX= B.XXAND ';
    set @Sql = @Sql + N' A.XX= B.uuid';
    set @Sql = @Sql + N'    WHERE A.XX= 1';
    set @Sql = @Sql + N'    and     (A.XX> 0)';
    set @Sql = @Sql + N'    ORDER BY XX, XX, XX, XX''';

参考资料:http://jingyan.baidu.com/article/9989c7463bfa25f648ecfe2f.html?st=2&os=0&bd_page_type=1&net_type=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值