20191013-SQLServer通过链接服务器查询视图报错 “消息 7347,级别 16”

在这里插入图片描述

问题:

通过 链接服务器 远程查看某张表数据时报如下错误:

消息 7347 ,级别 16 ,状态 1 ,第 1 行
链接服务器 '192.168.200.51' 的 OLE DB 访问接口 'SQLNCLI11' 返回的数据与列 '[192.168.200.51].[erp].[dbo].[vp_cust].PName' 所需的数据长度不匹配。所需的 ( 最大 ) 数据长度为 30 ,但返回的数据长度为 37 。

问题原因:

视图所在基表表结构发生变化, PName 字段字符长度变长了,但是 通过 链接服务器 远程查看的表仍然使用表 PName 字段 原来的字符长度, 表结构变化的信息没有同步,查询时显示数据长度不够;

解决方案:

手动刷新视图;

EXECUTE   sp_refreshview   N'dbo.vp_cust' ;

问题重现过程如下:

192.168.100.100 服务器创建链接服务器,连接 192.168.100.200 的 TESTDB 数据库;
192.168.100.200 创建测试数据;

Use TESTDB
Create table test1013(id int,col1 varchar(3));
Create view v_test1013 as select * from test1013;
Insert into test1013 values(1, ’ a ’ );
Insert into test1013 values(2, ’ bb ’ );
Insert into test1013 values(3, ’ ccc ’ );

192.168.100.100

Select * from [192.168.100.200].[TESTDB].[dbo].[v_test1013];
Id col1
1 a
2 bb
3 ccc

-192.168.100.200

Alter table test1013 alter column col1 varchar(5);
Insert into test1013 values(5, ’ eeeee ’ );
Select * from v_test1013;

192.168.100.100

Select * from [192.168.100.200].[TESTDB].[dbo].[v_test1013];
消息 7347 ,级别 16 ,状态 1 ,第 3   行
链接服务器 '192.168.2.141' 的 OLE DB 访问接口 'SQLNCLI11' 返回的数据与列 '[192.168.2.141].[erp352].[dbo].[v_ test1013 ]. col1 ' 所需的数据长度不匹配。所需的 ( 最大 ) 数据长度为 3 ,但返回的数据长度为 5 。

192.168.100.200

EXECUTE   sp_refreshview   N'dbo.v _test1013 ' ;

192.168.100.100

Select * from [192.168.100.200].[TESTDB].[dbo].[v_test1013];

Id col1
1 a
2 b
3 ccc
5 eeeee

欢迎关注我的微信公众号"IT小Chen"

<think>好的,用户现在遇到了SQL Server中创建视图时的错误,需要我的帮助解决。首先,我得回顾一下用户之前的对话和提供的引用内容,看看有没有相关的线索。 用户之前询问了关于SQL Server视图的创建和使用,我给出了详细的示例和常见操作,比如创建视图、使用加密、索引视图,以及维护视图的方法。现在用户遇到了CREATE VIEW AS语句报错的问题,需要解决方案。 首先,我需要考虑常见的CREATE VIEW错误原因。根据之前的回答和用户提供的引用,可能有以下几个原因: 1. **语法错误**:用户可能在视图定义的SELECT语句中有语法错误,比如缺少逗号、表名错误或者不正确的关键字使用。例如,用户可能在字段列表中漏掉了逗号,或者在WHERE子句中使用了错误的运算符。 2. **权限不足**:用户可能没有在目标数据库或表上创建视图的权限。需要检查用户是否有CREATE VIEW权限,以及是否对基础表有SELECT权限。 3. **引用的对象不存在或无效**:视图可能引用了不存在的表、字段,或者表结构发生了变化,比如字段被删除或重命名。这在引用[4]中提到过,当基表结构变化时,链接服务器可能没有同步结构,导致错误。 4. **使用了无效的选项或子句**:比如在视图中使用ORDER BY而没有TOP或FOR XML,或者在索引视图中没有使用SCHEMABINDING。用户之前的回答提到过索引视图需要SCHEMABINDING,所以如果用户尝试创建索引视图但忘记添加这个选项,会导致错误。 5. **加密视图的问题**:如果用户使用了WITH ENCRYPTION,但后续尝试修改视图时没有重新加密,或者加密导致元数据无法读取,也可能引发问题。引用[2]中提到了创建视图时使用加密,可能导致无法查看定义,但这里是否会导致创建错误呢?可能更多是在修改时的问题。 6. **版本兼容性问题**:引用[3]中提到镜像环境中的版本不一致导致错误,虽然这可能更偏向于高可用性问题,但也不能排除用户使用的SQL Server版本不支持某些语法,比如在旧版本中使用新功能。 接下来,用户提供的引用中有几个需要注意的地方: - 引用[1]提到通过视图插入数据,这可能涉及到视图的可更新性,但用户当前的问题是关于创建视图时的错误,所以可能暂时不需要考虑插入数据的限制。 - 引用[2]提到了创建视图时先检查是否存在并删除,这可能导致错误如果用户没有正确处理,比如在事务中或者权限问题导致DROP VIEW失败。 - 引用[4]提到基表结构变化导致链接服务器查询错误,这可能类似视图依赖的表结构变化,但用户现在的问题是在创建时出错,而不是查询时,所以可能需要检查表结构是否有效。 现在,我需要将这些可能的错误原因整理成步骤,帮助用户逐步排查问题。 首先,检查错误消息的具体内容。SQL Server的错误消息通常会给出具体的号和错误描述,比如“无效的列名”或“对象不存在”等。用户需要提供具体的错误信息,但假设用户没有提供,我需要列举常见错误及解决方案。 可能的解决方案步骤: 1. **验证SELECT语句**:确保视图中的SELECT语句单独执没有问题。用户可以先单独运SELECT部分,看是否有语法错误或无效的对象引用。 2. **检查对象存在性和权限**:确认所有引用的表、字段存在,并且用户有SELECT权限。如果使用了跨数据库链接服务器,还需要检查权限和链接配置(如引用[4]中的情况)。 3. **处理加密和架构绑定**:如果使用了WITH ENCRYPTION或SCHEMABINDING,确保语法正确。例如,SCHEMABINDING需要两部分的名称(即schema.object),并且不能使用SELECT *。 4. **检查保留字和命名规范**:确保视图名称和字段名没有使用保留字,或者使用了方括号转义。 5. **处理版本兼容性**:确认使用的SQL Server版本支持所有使用的功能。例如,某些聚合函数或语法可能在旧版本中不可用。 6. **处理依赖对象的结构变化**:如果基表结构已更改,需要更新视图定义。引用[4]中提到结构变化导致错误,可能在创建视图时如果表结构已经改变,需要调整SELECT语句。 另外,用户可能遇到的典型错误示例: - **无效的列名**:检查字段是否存在,是否有拼写错误,或者表结构已更改。 - **无法绑定对象**:在索引视图中未使用SCHEMABINDING,或者引用了多部分名称。 - **权限不足**:授予用户CREATE VIEW和SELECT权限。 - **语法错误**:如缺少逗号、错误的关键字顺序等。 最后,根据用户之前的回答中提到的维护视图的方法,比如使用ALTER VIEW或sp_refreshview,可能在某些情况下需要刷新视图元数据,但这通常是在基表结构变更后查询时的问题,而非创建时。 总结解决方案步骤,确保覆盖常见错误原因,并给出实际示例,如如何添加SCHEMABINDING,如何处理保留字等。同时,提醒用户检查具体的错误信息,因为不同的错误代码需要不同的处理方式,如消息7347可能与链接服务器有关,而用户的问题可能涉及类似情况。</think>### SQL Server创建视图报错解决方案(CREATE VIEW AS) 针对SQL Server创建视图时出现的错误,以下是常见原因及解决方法,按优先级排序: --- #### 一、基础语法验证(90%的常见错误) 1. **验证SELECT语句独立性** ```sql -- 先单独运视图中的SELECT语句 SELECT EmployeeID, FirstName, Department FROM Employees WHERE IsActive = 1 ``` 若报错,需检查: - 表名是否正确(区分大小写) - 字段是否存在(如`Department`是否被重命名或删除)[^4] - WHERE条件是否使用合法表达式 2. **保留字冲突处理** 若字段/表名使用保留字(如`User`, `Order`),需用方括号包裹: ```sql CREATE VIEW vw_SafeExample AS SELECT [User], [Order] FROM [OrderTable] ``` --- #### 二、权限与对象存在性检查 1. **创建权限验证** ```sql -- 检查当前用户是否有权限 USE 数据库名; EXEC sp_helprotect 'CREATE VIEW'; ``` 若无权限,需管理员授权: ```sql GRANT CREATE VIEW TO 用户名; ``` 2. **依赖对象存在性** - 检查所有引用的表、函数是否存在 -数据库引用时需添加数据库名前缀: ```sql SELECT * FROM AnotherDB.dbo.TableName ``` --- #### 三、特殊视图要求 1. **索引视图必须满足的条件** ```sql CREATE VIEW vw_IndexedView WITH SCHEMABINDING -- 必须添加 AS SELECT ProductID, SUM(Quantity) AS TotalQty FROM dbo.OrderDetails -- 必须使用两段式名称(架构.表名) GROUP BY ProductID ``` - 禁止使用`SELECT *` - 必须包含`WITH SCHEMABINDING`[^1] 2. **加密视图处理** ```sql CREATE VIEW vw_Encrypted WITH ENCRYPTION -- 加密后无法通过sp_helptext查看 AS SELECT SecurityCode FROM ConfidentialTable ``` - 加密后修改视图需重新执完整`CREATE`语句 --- #### 四、版本兼容性与环境问题 1. **SQL Server版本验证** ```sql SELECT @@VERSION ``` - 检查是否支持特定语法(如2016+的`STRING_SPLIT`函数) - 跨版本镜像部署时需保持版本一致(参考镜像配置问题[^3]) 2. **链接服务器同步问题** 若视图涉及链接服务器: ```sql EXEC sp_refreshview '视图名' -- 更新元数据缓存[^4] ``` --- #### 五、典型错误对照表 | 错误代码 | 原因 | 解决方案 | |---------|------|---------| | **208** | 对象不存在 | 检查表名拼写和架构前缀(如`dbo.Table`) | | **207** | 无效列名 | 验证字段是否存在,检查表结构变更 | | **1018** | 语法错误 | 检查逗号分隔、关键字顺序 | | **4512** | 权限不足 | 授予`CREATE VIEW`和`SELECT`权限 | --- #### 六、调试流程 1. 使用`BEGIN TRANSACTION` + `ROLLBACK`测试: ```sql BEGIN TRAN CREATE VIEW vw_test... -- 测试语句 ROLLBACK -- 避免实际创建 ``` 2. 查看完整错误堆栈: ```sql EXEC sp_executesql N'CREATE VIEW...' -- 捕获详细错误 ``` --- ### 相关问题 1. 如何通过系统视图查看已有视图的定义? 2. 视图与临时表在性能上有何区别? 3. 如何批量刷新所有视图的元数据? 通过上述步骤可解决大多数视图创建错误,若问题仍未解决,请提供具体错误信息以进一步诊断[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值