SQLServer开发过程中的的常见问题总结
SQL Server开发中你可能会问的十个问题:
1.表和字段有哪些常见的名称约束?
2.不了解T-SQL有可能写存储过程吗?
3.如何比较T-SQL中CLR存储过程和函数的性能?
4.如何在一个存储过程中使用另一个存储过程产生的结果?
5.如何解决SQL Server 2005的并发问题?
6.什么工具取代了SQL Server 2005中的查询分析器?
7.能否提供一些关于SQL和T-SQL的详细信息?
8.SQL Server 2005有新的索引类型吗?
9.如何创建一个脚本来在表中进行选择?
10.如何列出那些没有记录的数据库表?
表和字段的通用名称约束
回答:
SQL Server 2000下的表名和字段名的长度限制为1到128个字节,并遵循标识规则。
第一个字母必须是下列之一:
Unicode标准2.0中指定的字母。
Unicode字母的定义包括:拉丁字母,从A到Z,其他语言的字母除外。
下划线(_)、at符号(@)或数字符号(#)
在SQL Server中,将这些符号作为标识符的开头具有特殊的意义。以at符号(@)开头的标识符表示局部变量或参数。以数字符号(#)开头的标识符表示临时表或过程。以两个数字(# #)开头的标识符标识一个全局临时对象。
某些Transact-SQL函数的名称以两个at符号(@ @)开头。为了避免与这些函数混淆,建议您不要使用以两个at符号(@ @)开头的标识符。
以下字母可以是以下任意字母:
Unicode标准2.0定义的字母
来自基本拉丁语或其他发音的十进制数
At符号(@)、美元符号($)、数字符号(#)或下划线。
标识符不能是Transact-SQL的保留字。SQL Server保留了一些大小写保留字。不允许内置空或特殊字母,虽然你可以看到在老版的北风之神里面有内置空。在访问它们之前,必须用括号将它们括起来。
在没有任何T-SQL知识的情况下编写SQL Server2005存储过程?
许多程序员认为T-SQL不再是创建SQL Server存储过程所必需的。不幸的是(或者不是,根据你的观点),这并不是全部的真相。从技术上来说,你可以在不了解T-SQL的情况下创建存储过程,但是没有T-SQL就不能访问任何数据。
CLR存储过程中的数据访问是通过使用标准ADO.NET类来完成的。开发人员会在应用层发现很多同样无用的数据访问代码,这些代码会很容易地转移到SQLCLR例程中。当中间层的这些ADO.NET类需要使用T-SQL访问数据时,在CLR host提供的环境中也会使用相同的类。
我想强调的是,从技术角度来看,不使用T-SQL也可以编写存储过程。那么有什么理由这样做呢?一种情况是,这是一个CLR存储过程,用于从普通文件或网络服务中检索数据,数据格式设置为rowset。这里可能会用到不需要T -SQL的操作——但这并不是对T-SQL存储过程能力的一个很好的比喻。
CLR存储过程与T-SQL存储过程
与T-SQL存储过程和函数相比,CLR存储过程和函数的性能如何?
回答:
这里有一个用于比较T-SQL例程和CLR例程性能的通用规则:在您的服务器上使用您的数据,并测试两组配置,以查看哪一组更好。
也就是很多人都运行过性能测试,一般的结果是T-SQL在标准的CRUD(创建、读取、更新、删除)操作中表现更好,而CLR在复杂的数学、字符串赋值等数据访问之外的任务中表现更好。
SQL Server专家Gustavo Larriera编辑了一些关于此主题的有用链接,如下所示:
在SQL Server 2005中使用CLR集成。
简单介绍一下SQL Server 2005中的CLR集成。
在SQL Server 2005中选择CLR和T-SQL。
介绍SQL Server 2005中的CLR集成。
SQL Server聊天:SQL Server 2005 Beta 2 CLR问答
数据库管理员的辩护。网。
用户自定义函数的性能比较。
如何在一个存储过程中使用另一个存储过程的结果?
专家回答:
只要一个存储过程只产生一个结果,在另一个存储过程中使用这个存储过程的输出就非常简单。这种技术是用一个临时表加载存储过程的巨大iguo,然后通过INSERT EXEC语句执行过程并保存结果。一旦结果保存在临时表中,他们就可以像使用其他表数据一样使用它。
下面是一个我们可能会重用的流程示例:
将过程usp_Demo_AllAuthors创建为
从酒馆中选择*..作者
去
现在有一个存储过程使用usp_Demo_AllAuthors的结果:
CREATE proc usp_Demo_SPUser作为CREATE TABLE #Authors(
au_id varchar(11)非空聚集主键,
au_lname varchar (40)不为空,
au_fname varchar (20)不为空,
电话计费(12)不为空,
address varchar (40) NULL,
city varchar (20) NULL,
状态char (2)为空,
邮政编码(5)为空,
合同位不为空
)–执行usp_Demo_AllAuthors存储
–作者数量的结果
插入#Authors
exec USP _ Demo _ all Authors–这里我们使用#Authors表。仅这个例子
–仅从临时表中选择,但您可以做很多事情
–更多,如在表上使用光标或join with
–其他数据。
选择au_fName + ' ' + au_lname作为[名称]
,地址+','+城市+','+州+' '+邮政编码[地址]
来自#AuthorsDROP表#Authors
去
SQL Server 2005中存储过程的并发性
我在SQL Server2005中遇到了并发问题。凭我的票,车上还有几个空空位。在我插入销售的机票支票之前,我需要检查是否有任何座位可用空。我的存储过程的作用如下:
创建过程add _ ticket参数
DECLARE free _ seats int BEGIN TRANSACTION SELECT free _ seats
= COUNT(*)从座位未被占用的票中,如果座位空闲
0 INSERT INTO tickets VALUES(…) —其他一些语句结束事务
问题是两个进程可以同时读取空空闲票,都可以预留一张票,即使没有空剩余。我需要一种方法来防止一个进程在另一个进程中运行add_ticket程序,但是在没有插入新票的情况下读取空票的数量。
回答:
你是对的;较高的隔离级别不能保证多个读取器会同时读取同一数据行。然而,有几种方法可以完成这项工作。例如,您可以为每个座位分配一个惟一的标识符(即惟一的键,不一定是GUID ),并创建一个表来描述哪些座位已经被预订。在表上放一个惟一的约束,就可以保证同一个座位不会被插入两次。
也就是说,我觉得更有趣的方式是使用SQL Service Broker。您可以为每条总线建立一个会话,并将该会话的句柄存储在一个表中,读者可以在接收之前参考该表。这样读者才能正确筛选。公共汽车上的每个座位都在队列中插入一条消息。读者可以简单地接收所需的信息(在此过程中,在公共汽车上预订座位)。Service Broker将确保任何消息都不会被接受两次,这意味着您不会再遇到并发问题。
SQL Server 2005中的查询分析器已被取代。
回答:
你是对的。查询分析器和企业管理器都已从SQL Server中删除。它们被一个工具SQL Server Management Studio所取代。这个工具拥有其前身的大部分功能,但它有一个升级的用户界面和许多改进的功能。我认为大多数数据库管理员会发现这是一个很好的升级。
如果您想了解更多有关SQL Server管理套件的新功能,请阅读SearchSQLServer.com上关于此主题的文章。
SQL与T-SQL
回答:
SQL是一种结构化查询语言,也是ANSI/ISO认可的标准数据库语言。SQL Server的实现语言叫做Transact-SQL (T-SQL)。T-SQL基本上是根据1992年发布的ISO标准出现的,在1999年的标准上略有修改。此外,微软还进行了各种私有增强。
标准SQL和T-SQL有很多区别——太多了,这里就不说了。此外,如果您在SQL Server上工作,使用这些私有扩展是有益的。由于很多SQL Server的特殊性,如果不使用非标准命令,会有很多强大的功能无法实现。如果您想看看您的SQL是否符合标准,您可以使用命令集FIPS _弗拉格。
SQL Server 2005中有新的索引类别吗?
回答:
SQL Server 2005没有为关系表引入新的索引类型。基本上——聚集索引和非聚集索引都是以B树的方式实现的——并且仍然在使用。但是,无论是全文索引还是XML数据,SQL Server 2005都包含一些对索引的增强。此外,这些增强还可以改善一些与关系索引相关的问题。
SQL Server 2005的全文索引功能是全新的,并且经过了重写。要获取有关此功能的信息,请阅读Nimish Khanolkar的MSDN广播文档,该文档介绍了SQL Server 2005中的全文搜索。
XML是SQL Server 2005中的另一项内容,它在方式上经历了巨大的变化。现在,开发人员可以使用一流的XML数据类型。该类型支持XQuery查询语言,使用该类型的字段可以通过特殊格式的XML index进行索引。要了解更多关于XML类型的知识,请查阅MSDN的文章。
T-SQL索引命令也有各种增强功能。也许最有趣的是新的“在线”索引类型,它允许数据库管理员执行索引维护任务,而不会将用户锁定在表之外。这很可能标志着数据库管理员必须等到下午3点才能打开维护窗口来修复问题的情况结束了!若要了解有关此功能的更多信息,请查找有关SQL Server全球用户组的文章。
为行选择创建脚本。
想象这张桌子:
产品_关键项目_关键包_关键最后_销售
2004年12月5日
LM870 1029 AD100 2005年9月20日
2003年7月12日
2004年8月7日
当item_key和pack_key相等时,我希望选择日期较大的行。换句话说,我想要:
LM870 1029 AD100 2005年9月20日
2004年8月7日
回答:
这个表有主键吗?在这种情况下,查询可能会更容易。无论如何,我认为你应该遵循以下几点:
SELECT产品关键字,项目关键字,包装关键字,最后销售
FROM (SELECT item_key,pack_key,MAX(last_sale)
AS last _ sale FROM tablex GROUP BY item _ key,pack_key) AS MaxDateTable
其中tablex . item _ key = max date table . item _ key
以及tablex . pack _ key = max date table . pack _ key
以及tablex . last _ sale = max date table . last _ sale
列出没有记录的数据库表。
我创建了一个动态SQL Server查询来输出表中的行数。我的目标是列出数据库中没有记录的表。查询如下所示:
declare @strsql varchar(100)
declare @tablename varchar(50)
@ tablename = ' table 123 ' @ strsql = '
select count(*)from '+@ tablename exec(@ strsql)
我得到了输出,但是我不能将这个值存储在一个变量中以备将来引用。
B I想这样看待这件事:
/* @计数变量=0
打印(@tablename)*/
还有其他解决方法吗?
回答:
通过从sysobjects表中获取表名,可以使您的解决方案更加灵活:
declare @strsql varchar(256)
创建表#emptytables
(tablename varchar(128),table_rowcount int)select
@strsql= '选择distinct o.name作为TableName,
。rowcnt as Table_RowCount
从系统对象o
内部联接sysindexes x
在o.id = x.id上
其中x.rowcnt = 0,并且
o . type = " " U " ' insert # empty tables(TableName,
Table_rowcount) exec (@strsql)
select * from #emptytables
删除表#emptytables
位律师回复
0条评论