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