在SQL Server 2005中,我们可以通过以下两种方式之一创建临时表:
declare @tmp table (Col1 int, Col2 int);
Run Code Online (Sandbox Code Playgroud)
要么
create table #tmp (Col1 int, Col2 int);
Run Code Online (Sandbox Code Playgroud)
这两者有什么不同?关于@tmp是否仍然使用tempdb,或者是否所有内容都发生在内存中,我已经阅读了相互矛盾的意见.
在哪种情况下,一个人胜过另一个?
我真的需要看一些关于当前公认的企业应用程序设计范例的优点的诚实,深思熟虑的辩论.
我不相信实体对象应该存在.
实体对象我指的是我们倾向于为我们的应用程序构建的典型事物,如"人","帐户","订单"等.
我目前的设计理念是这样的:
(注意:我还使用Java EE构建了企业应用程序,java人员请用等价替换我的.NET示例)
我不是反OO.我为不同的目的写了很多类,而不是实体.我承认我编写的大部分类都是静态助手类.
我不是在建造玩具.我在谈论跨多台机器部署的大型高容量事务应用程序.Web应用程序,Windows服务,Web服务,b2b交互,您可以为其命名.
我使用过OR Mappers.我写了几个.我使用过Java EE堆栈,CSLA和其他一些等价物.我不仅使用它们,而且还在生产环境中积极开发和维护这些应用程序.
我已经得出了经过实战考验的结论,即实体对象正在阻碍我们,如果没有它们,我们的生活会变得如此简单.
考虑这个简单的例子:你得到一个关于你的应用程序中某个页面不能正常工作的支持调用,可能其中一个字段没有像它应该那样持久化.使用我的模型,分配给发现问题的开发人员正好打开3个文件.ASPX,ASPX.CS和带有存储过程的SQL文件.该问题可能是存储过程调用缺少的参数,需要几分钟才能解决.但是对于任何实体模型,您总是会启动调试器,开始逐步执行代码,最终可能会在Visual Studio中打开15-20个文件.当你走到堆栈底部时,你忘记了你的起点.我们一次只能在头脑中保留这么多东西.软件非常复杂,无需添加任何不必要的图层.
开发复杂性和故障排除只是我抱怨的一个方面.
现在让我们谈谈可扩展性.
开发人员是否意识到每次编写或修改与数据库交互的任何代码时,他们都需要对数据库的确切影响进行彻底的分析?而不仅仅是开发副本,我的意思是模仿生产,所以你可以看到你现在需要的对象的附加列只是使当前的查询计划失效,而在1秒内运行的报告现在需要2分钟,因为您在选择列表中添加了一个列?事实证明,您现在需要的索引是如此之大,以至于DBA将不得不修改文件的物理布局?
如果让人们通过抽象让物理数据存储距离太远,他们就会对需要扩展的应用程序造成严重破坏.
我不是狂热者.我可以确信我是否错了,也许我是,因为Linq对Sql,ADO.NET EF,Hibernate,Java EE等有如此强烈的推动.请通过您的回答思考,如果我遗漏了一些东西我我真的想知道它是什么,为什么我应该改变我的想法.
[编辑]
看起来这个问题突然再次激活,所以现在我们有了新的评论功能,我直接评论了几个答案.感谢回复,我认为这是一个健康的讨论.
我可能应该更清楚我正在谈论企业应用程序.我真的不能评论一个在某人的桌面或移动应用程序上运行的游戏.
有一点我必须在顶部提出以回应几个类似的答案:正交性和关注点分离经常被引用作为实体/ ORM的理由.对我来说,存储过程是我能想到的关注点分离的最好例子.如果您不允许除了通过存储过程之外的所有其他数据库访问,理论上您可以重新设计整个数据模型而不破坏任何代码,只要您维护存储过程的输入和输出即可.它们是按合同编程的完美示例(只要您避免"select*"并记录结果集).
询问那些已经在这个行业工作了很长时间并且使用过长期应用程序的人:在数据库存在的时候,有多少应用程序和UI层已经出现了?当有4个或5个不同的持久层生成SQL来获取数据时,调整和重构数据库有多难?你什么都不能改变!ORM或任何生成SQL的代码都会锁定您的数据库.
在数据库字段中存储电话号码的良好数据结构是什么?我正在寻找足够灵活的东西来处理国际号码,还有一些能够有效查询号码各个部分的东西.
编辑:只是为了澄清这里的用例:我目前将数字存储在一个varchar字段中,并在客户输入时将其保留.然后,当代码需要该数字时,我将其标准化.问题是,如果我想查询几百万行来查找匹配的电话号码,它涉及一个功能,如
where dbo.f_normalizenum(num1) = dbo.f_normalizenum(num2)
Run Code Online (Sandbox Code Playgroud)
这是非常低效的.当只是一个varchar字段时,寻找像区域代码之类的东西的查询变得非常棘手.
[编辑]
人们在这里提出了很多好建议,谢谢!作为一个更新,这里是我现在正在做的事情:我仍然在varchar字段中存储与输入完全相同的数字,但是在查询时没有规范化事物,我有一个触发器,可以在插入记录时完成所有工作或更新.所以我对我需要查询的任何部分都有内联或重要内容,并且这些字段被编入索引以使查询运行得更快.
我对TSQL中的某些东西感到惊讶.我认为,如果xact_abort打开,调用类似的东西
raiserror('Something bad happened', 16, 1);
Run Code Online (Sandbox Code Playgroud)
将停止执行存储过程(或任何批处理).
但我的ADO.NET错误消息恰恰相反.我在异常消息中收到了raiserror错误消息,以及之后发生的下一个错误消息.
这是我的解决方法(无论如何这是我的习惯),但它似乎不应该是必要的:
if @somethingBadHappened
begin;
raiserror('Something bad happened', 16, 1);
return;
end;
Run Code Online (Sandbox Code Playgroud)
文档说这个:
当SET XACT_ABORT为ON时,如果Transact-SQL语句引发运行时错误,则终止并回滚整个事务.
这是否意味着我必须使用显式交易?
在高容量.NET应用程序中,您可能会在尝试执行查询时看到此异常:
System.Data.SqlClient.SqlException:将请求发送到服务器时发生传输级错误.
根据我的研究,这是"刚刚发生"的事情,并没有太多可以防止它.它不会因错误查询而发生,通常无法复制.当由于某种原因与数据库的TCP连接变坏时,它在繁忙的OLTP系统中可能每隔几天就会出现一次.
我被迫通过解析异常消息,然后从头开始重试整个操作来检测此错误,以包括使用新连接.这些都不是很好.
有人有任何替代解决方案吗?
当在TSQL或PLSQL之类的东西中编写数据库查询时,我们通常可以选择使用游标迭代行来完成任务,或者制作一个同时执行相同作业的单个SQL语句.
此外,我们可以选择简单地将大量数据拉回到我们的应用程序中,然后使用C#或Java或PHP或其他任何方式逐行处理.
为什么使用基于集合的查询更好?这个选择背后的理论是什么?什么是基于游标的解决方案及其关系等效的一个很好的例子?
好的,有一百万个正则表达用于验证电子邮件地址,但是如何将一些基本的电子邮件验证集成到Sql Server 2005的TSQL查询中?
我不想使用CLR程序或功能.只是直接TSQL.
有人已经解决了这个问题吗?
如果您在Google上搜索此问题,您会发现很多不正确,误导性和过时的信息.令人惊讶的是,Stack Overflow上没有一个可靠的答案,所以我们应该改变它.
我正在使用Apache和PHP的Mac端口安装.我已经安装了php5-mssql,我可以在我的phpinfo()页面上看到mssql.
但我不认为它在PDO下列出.
PDO support enabled
PDO drivers dblib, mysql, odbc, pgsql
Run Code Online (Sandbox Code Playgroud)
mssql是否与PDO无关?是否有其他驱动程序可以在Mac上使用PDO连接到SqlServer数据库?似乎这是应该可能的事情.
这是我在另一个论坛上提出的一个问题,该问题得到了一些不错的答案,但我想知道这里是否有人有更多的见解.
问题是,当Web应用程序中的某个页面进入存储过程调用时会超时,因此您使用Sql Profiler或应用程序跟踪日志来查找查询并将其粘贴到管理工作室中我们为什么运行缓慢.但是你从那里开始运行它只是开始燃烧,每次返回不到一秒钟.
我的具体案例是使用ASP.NET 2.0和Sql Server 2005,但我认为这个问题可能适用于任何RDBMS系统.
这是我遇到的问题:我有一个大型查询需要比较where子句中的日期时间,以查看两个日期是否在同一天.我当前的解决方案很糟糕,是将日期时间发送到UDF以将它们转换为同一天的午夜,然后检查这些日期是否相等.当涉及到查询计划时,这是一场灾难,几乎所有联接中的UDF或where子句都是如此.这是我的应用程序中唯一一个我无法根除函数并为查询优化器提供实际可用于查找最佳索引的地方之一.
在这种情况下,将函数代码合并回查询似乎是不切实际的.
我想我在这里缺少一些简单的东西.
这是参考功能.
if not exists (select * from dbo.sysobjects
where id = object_id(N'dbo.f_MakeDate') and
type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
exec('create function dbo.f_MakeDate() returns int as
begin declare @retval int return @retval end')
go
alter function dbo.f_MakeDate
(
@Day datetime,
@Hour int,
@Minute int
)
returns datetime
as
/*
Creates a datetime using the year-month-day portion of @Day, and the
@Hour and @Minute provided
*/
begin
declare @retval datetime
set @retval = cast(
cast(datepart(m, @Day) as varchar(2)) …Run Code Online (Sandbox Code Playgroud)