提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:莫成敏|2019-09-06 14:09:59.827|阅读 356 次
概述:本篇教程说明了SQL_VARIANT数据类型的“怪癖”,以及为什么最好调查SQL Prompt何时提醒您使用它。如果在使用之前将其显式转换为真实类型,那么将数据存储为SQL_VARIANT才是唯一安全的。本文描述教程的上半部分。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
SQL Prompt根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。SQL Prompt安装即可使用,能大幅提高编码效率。此外,用户还可根据需要进行自定义,使之以预想的方式工作。
本教程说明了SQL_VARIANT数据类型的“怪癖”,以及为什么最好调查SQL Prompt何时提醒您使用它。如果在使用之前将其显式转换为真实类型,那么将数据存储为SQL_VARIANT才是唯一安全的。本文描述教程的上半部分。
sql_variant数据类型来自几个不同数据类型的值,并由SQL Server在内部使用。它不是SQL标准的一部分,在关系数据库中的用途有限。需要小心处理它,因为它的误用会导致难以追踪的性能问题和bug。sql_variant不能直接传递给某些SQL运算符和函数,例如LIKE、SUM()或者AVG(),并且在比较或表达式中使用时会产生误导性结果。除二进制数据外,它不能通过ODBC返回到应用程序。
SQL Server是一种强类型语言,这样做是为了确保数据完整性、高效存储和有效检索。由于这个原因,使用sql_variant有点奇怪,因此通过不明智地使用它会无意中造成问题也就不足为奇了。出于这些原因,SQL Prompt强制执行“最佳实践”代码分析规则(BP024),该规则将提醒您使用sql_variant数据类型。
与许多“最佳实践”规则一样,这些建议有时听起来像是告诉人们在拿着剪刀时不要跑。在这种情况下,只有在使用数据sql_variant之前将其显式转换为真实类型,才能将数据存储为安全。
为什么有sql_variant?
sql_variant数据类型是在微软从Sybase开发的SQL Server时首次引入的。他们需要能够从微软首次进入数据库市场的Microsoft Access将数据库导入SQL Server,该市场支持变体数据类型。它仍然在SQL Server内部用于系统存储过程的参数以及扩展属性等数据。
sql_variant倾向于作为用户定义函数返回的列、变量、参数或值的catch-all数据类型。它最多可以容纳8000个字节,并且可以存储基本数据类型,如整数、小数、字符串和日期。它不能存储其他一些数据类型,例如(MAX)数据类型、CLR数据类型或XML。
有时,sql_variant可能是一个有用的工具,例如在处理不一致或未指定的数据类型时,这通常是因为数据库支持允许用户定义数据的应用程序。
它存储所包含的值的基本数据类型,因此当它用作中介时,强制执行数据类型之间的所有转换规则。您可以使用数据类型函数检索此基本数据类型sql_variant_property():
DECLARE @MyVariant SQL_VARIANT = '2.3657' SELECT SQL_VARIANT_PROPERTY(@MyVariant,'BaseType')
在这种情况下返回varchar。这里还有一些其他有用的属性:Precision、Scale、TotalBytes、Collation和MaxLength。如果要从sql_variant生成主键,则TotalBytes参数使该函数可用作初步检查,因为主键(或索引)的总大小限制为900字节。
顺便提一句,您可以在任何数据类型上使用此函数。例如:
SELECT SQL_VARIANT_PROPERTY(N'Béoáed mac Ocláin','collation')
聚合
让我们看看如果我们尝试聚合sql_variant列会发生什么。为了简单起见,我们将从派生表中执行此操作。
SELECT Sum(ValueAsVariant) FROM ( VALUES (Convert(SQL_VARIANT, 'one'), 1, Convert(SQL_VARIANT, 1)), ('two', 2, 2), ('three', 3, 3), ('four', 4, 4), ('five', 5, 5) ) AS f (ValueAsString, ValueAsInt, ValueAsVariant);
我们看到一个错误:
Msg 8117,Level 16,State 1,Line 3操作数数据类型sql_variant对sum运算符无效。
而如果我们先显式地转换为数字(int、numeric等等),它工作正常。
SELECT Sum(Convert(NUMERIC(9,4), ValueAsVariant)) -- try sum, avg, stdev, stdevp, var, varp, or string_agg FROM ( VALUES (Convert(SQL_VARIANT, 'one'), 1, Convert(SQL_VARIANT, 1)), ('two', 2, 2), ('three', 3, 3), ('four', 4, 4), ('five', 5, 5) ) AS f (ValueAsString, ValueAsInt, ValueAsVariant);
在max()和min()聚合函数似乎很好地工作的sql_variant数据类型,所以不可能有技术问题阻止其他函数工作。
本教程内容尚未完结,后续内容请点击下面的文章~
彩票走势图相关的文章:
SQL语法提示工具SQL Prompt教程:使用SQL_VARIANT数据类型引起的问题(下)
SQL语法提示工具SQL Prompt教程:避免使用@@IDENTITY函数的原因
SQL语法提示工具SQL Prompt教程:忽略使用或滥用RETURN关键字(BP016)
SQL语法提示工具SQL Prompt教程:添加NOT NULL列或使可空列NOT NULL的问题(上)
SQL语法提示工具SQL Prompt教程:添加NOT NULL列或使可空列NOT NULL的问题(下)
想要购买SQL Prompt正版授权,或了解更多产品信息请点击
扫描关注慧聚IT微信公众号,及时获取最新动态及最新资讯
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢