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

来源:互联网 发布:枪炮与玫瑰乐队 知乎 编辑:程序博客网 时间:2024/06/05 01:53

背景:
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