MSSQL数据库 :如何给 存储过程中的 IN() 传递参数,谁能够帮忙修改一些。

MSSQL数据库 :如何给 存储过程中的 IN() 传递参数,谁能够帮忙修改一些。,第1张

中的项不固定大小,应该选一个足够大的值,varchar(1000)

CREATE PROCEDURE [dbo][Stat_MultiplesLoadByUnionAll]

( @Cells nvarchar(255),@name1 varchar(1000) )

as

begin

if (@name1 <>'' or @name1 is not null)

begin

select @UnionTable=isnull(@UnionTable+' union all select '+@Cells+' from ',' select '+@Cells+' from ) +quotename(Name) from sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 and name in (' + @name1 =')'

end

end

--注意@name1 传入的格式 是'tab1','tab2','tab3' 这样的,才能拼对

1create database 创建图书馆数据库

on

(name = '图书馆数据库',

filename = '存储位置\图书馆数据库mdf',

size = 5mb,

maxsize = 5mb,

filegrowth = 0mb

)

log on(

name = '图书馆事务日志',

filename = '存储位置\图书馆事务日志ldf',

size = 1mb,

maxsize = 1mb,

filegrowth = 0

)

2create table 图书表

(图书编号 int,图书名 char(20),作者 char(20),类别 char(20),单价 int)

create table 读者表

(读者编号 int , 读者名 char(20))

create table 借阅表

(图书编号 int,读者编号 int ,借书时间 datetime,还书时间 datetime)

3insert into 表名(字段一,字段二。。。)

values (要插入的内容用,分开)

字段你知道是什么吧? 就是你那些表里的列名

4select from 图书表

where 类别 = '计算机'

5select from图书表

where图书编号 in (select 图书编号 from 借阅表

where 借书时间 = '20090103')

6因为你没有给出已归还的图书的任何条件或信息 所以没法做

in后面要填写外部accesss数据库之完整路径名,并且该外部数据库必须实际存在于路径名所指定的磁盘位置上。

例如这样写:

SELECT INTO Persons IN 'C:\Documents and Settings\Administrator\桌面\Backupmdb'

FROM Persons;

MySQL命令行导出数据库:

1,进入MySQL目录下的bin文件夹:cdMySQL中到bin文件夹的目录

如我输入的命令行:cdC:ProgramFilesMySQLMySQLServer41in

(或者直接将windows的环境变量path中添加该目录)

2,导出数据库:mysqlmp-u用户名-p数据库名

如我输入的命令行:mysqlmp-uroot-pnews

(如果导出单张表的话在数据库名后面输入表名即可)

3、会看到文件newssql自动生成到bin文件下

命令行导入数据库:

1,将要导入的sql文件移至bin文件下,这样的路径比较方便

2,同上面导出的第1步

3,进入MySQL:mysql-u用户名-p

如我输入的命令行:mysql-uroot-p(输入同样后会让你输入MySQL的密码)

4,在MySQL-Front中新建你要建的数据库,这时是空数据库,如新建一个名为news的目标数据库

5,输入:mysql

如我输入的命令行:mysql

6,导入文件:mysql

如我输入的命令行:mysql

SQL数据库语句大全:

1、选择:select from table1 where 范围

2、插入:insert into table1(field1,field2) values(value1,value2)

3、删除:delete from table1 where 范围

4、更新:update table1 set field1=value1 where 范围

5、排序:select from table1 order by field1,field2 [desc]

6、总数:select count as totalcount from table1

7、求和:select sum(field1) as sumvalue from table1

几个高级查询运算词:

A、UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

B、EXCEPT 运算符

EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

C、INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

具体要注意的:

1应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0

2应尽量避免在 where 子句中使用!=或<> *** 作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

3应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20

可以这样查询:

select id from t where num=10

union all

select id from t where num=20

4in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:

select id from t where num in(1,2,3)

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

5尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。

见如下例子:

SELECT FROM T1 WHERE NAME LIKE ‘%L%’

SELECT FROM T1 WHERE SUBSTING(NAME,2,1)=’L’

SELECT FROM T1 WHERE NAME LIKE ‘L%’

即使NAME字段建有索引,前两个查询依然无法利用索引完成加快 *** 作,引擎不得不对全表所有数据逐条 *** 作来完成任务。而第三个查询能够使用索引来加快 *** 作。

6必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

select id from t where num=@num

可以改为强制查询使用索引:

select id from t with(index(索引名)) where num=@num

7应尽量避免在 where 子句中对字段进行表达式 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:

SELECT FROM T1 WHERE F1/2=100

应改为:

SELECT FROM T1 WHERE F1=1002

SELECT FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’

应改为:

SELECT FROM RECORD WHERE CARD_NO LIKE ‘5378%’

SELECT member_number, first_name, last_name FROM members

WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21

应改为:

SELECT member_number, first_name, last_name FROM members

WHERE dateofbirth < DATEADD(yy,-21,GETDATE())

即:任何对列的 *** 作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将 *** 作移至等号右边。

8应尽量避免在where子句中对字段进行函数 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where substring(name,1,3)='abc'--name以abc开头的id

select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id

应改为:

select id from t where name like 'abc%'

select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

9不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

10在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

11很多时候用 exists是一个好的选择:

select num from a where num in(select num from b)

用下面的语句替换:

select num from a where exists(select top 1 from b where num=anum)

SELECT SUM(T1C1)FROM T1 WHERE(

(SELECT COUNT()FROM T2 WHERE T2C2=T1C2>0)

SELECT SUM(T1C1) FROM T1WHERE EXISTS(

SELECT FROM T2 WHERE T2C2=T1C2)

两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

如果你想校验表里是否存在某条纪录,不要用count()那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:

IF (SELECT COUNT() FROM table_name WHERE column_name = 'xxx')

可以写成:

IF EXISTS (SELECT FROM table_name WHERE column_name = 'xxx')

经常需要写一个T_SQL语句比较一个父结果集和子结果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:

SELECT ahdr_key FROM hdr_tbl a---- tbl a 表示tbl用别名a代替

WHERE NOT EXISTS (SELECT FROM dtl_tbl b WHERE ahdr_key = bhdr_key)

SELECT ahdr_key FROM hdr_tbl a

LEFT JOIN dtl_tbl b ON ahdr_key = bhdr_key WHERE bhdr_key IS NULL

SELECT hdr_key FROM hdr_tbl

WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)

三种写法都可以得到同样正确的结果,但是效率依次降低。

12尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

13避免频繁创建和删除临时表,以减少系统表资源的消耗。

14临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

15在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

16如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

17在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

18尽量避免大事务 *** 作,提高系统并发能力。

19尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

20 避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化 *** 作。例如:

SELECT name FROM employee WHERE salary > 60000

在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。

21充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。

例:

SELECT SUM(AAMOUNT) FROM ACCOUNT A,CARD B WHERE ACARD_NO = BCARD_NO

SELECT SUM(AAMOUNT) FROM ACCOUNT A,CARD B WHERE ACARD_NO = BCARD_NO AND AACCOUNT_NO=BACCOUNT_NO

第二句将比第一句执行快得多。

22、使用视图加速查询

把表的一个子集进行排序并创建视图,有时能加速查询。它有助于避免多重排序 *** 作,而且在其他方面还能简化优化器的工作。例如:

SELECT custname,rcvblesbalance,……other columns

FROM cust,rcvbles

WHERE custcustomer_id = rcvlbescustomer_id

AND rcvbllsbalance>0

AND custpostcode>“98000”

ORDER BY custname

如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个视图中,并按客户的名字进行排序:

CREATE VIEW DBOV_CUST_RCVLBES

AS

SELECT custname,rcvblesbalance,……other columns

FROM cust,rcvbles

WHERE custcustomer_id = rcvlbescustomer_id

AND rcvbllsbalance>0

ORDER BY custname

然后以下面的方式在视图中查询:

SELECT * FROM V_CUST_RCVLBES

WHERE postcode>“98000”

视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

23、能用DISTINCT的就不用GROUP BY

SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID

可改为:

SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10

24能用UNION ALL就不要用UNION

UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源

35尽量不要用SELECT INTO语句。

SELECT INOT 语句会导致表锁定,阻止其他用户访问该表。

上面我们提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,往往需要反复试验比较不同的语句以得到最佳方案。最好的方法当然是测试,看实现相同功能的SQL语句哪个执行时间最少,但是数据库中如果数据量很少,是比较不出来的,这时可以用查看执行计划,即:把实现相同功能的多条SQL语句考到查询分析器,按CTRL+L看查所利用的索引,表扫描次数(这两个对性能影响最大),总体上看询成本百分比即可。

今天在itput上看了一篇文章,是讨论一个语句的优化:

原贴地址: >

以上就是关于MSSQL数据库 :如何给 存储过程中的 IN() 传递参数,谁能够帮忙修改一些。全部的内容,包括:MSSQL数据库 :如何给 存储过程中的 IN() 传递参数,谁能够帮忙修改一些。、SQL数据库知识、SQL IN 子句可用于向另一个数据库中拷贝表 SELECT * INTO Persons IN 'Backup.mdb' FROM Persons等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9515043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存