SQLServer开发过程中的的常见问题总结

SQLServer开发过程中的的常见问题总结,第1张

SQLServer开发过程中的的常见问题总结,第2张

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

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » SQLServer开发过程中的的常见问题总结

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情