首页 > 开发 > 综合 > 正文

t-sql 笔记(1)

2024-07-21 02:48:48
字体:
来源:转载
供稿:网友
t-sql 笔记(1)1.查询哪些数据库对象使用了某个表
SELECT b.[name], a.[definition]FROM sys.all_sql_modules a, sysobjects bWHERE a.[object_id] = id AND definition LIKE '%表名%'
2.查询表的某一列,将结果变成用逗号分隔的字符串
select col+',' from mytable for xml path('')
3.查询有哪些表的表名包含“storeroom”
 select * from sysobjects obj where LOWER(obj.name) LIKE N'%storeroom%' and xtype='U'
4.分组条件求和
DECLARE @t1 TABLE ( c1   NUMERIC (12), c2   VARCHAR (30) )INSERT INTO @t1 (c1, c2) VALUES (1, 'a');INSERT INTO @t1 (c1, c2) VALUES (2, 'a');INSERT INTO @t1 (c1, c2) VALUES (3, 'b');INSERT INTO @t1 (c1, c2) VALUES (4, 'b');SELECT CASE WHEN max (c1) > 3 THEN sum (c1) ELSE 0 END AS c  FROM @t1GROUP BY c2;/*结果:c07*/
5.求某一天所在星期的周日

http://www.cnblogs.com/wsdj-ITtech/archive/2011/10/06/2199736.html

USE [MSSQL]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [dbo].[My_OneDay_GetWeekFirstAndEndDay](@tmpDate DATETIME)RETURNS  @tmpTable TABLE(FirstDay DATETIME , EndDay DATETIME)ASBEGIN    INSERT INTO @tmpTable    SELECT a.FirstDay,b.EndDay FROM (            SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 0) AS FirstDAy    ) a    LEFT JOIN (        SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 6) AS EndDay    ) b    ON a.ID = b.ID    RETURNEND
SELECT * from  My_OneDay_GetWeekFirstAndEndDay('2010-09-01')

6.求时间段内周日的数量

http://www.cnblogs.com/wsdj-ITtech/archive/2011/10/06/2199736.html

CREATE FUNCTION [dbo].[MY_Range_GetWeekFirstAndEndDays](@tmpDateSTART DATETIME,@tmpDateEND DATETIME)RETURNS  @tmpTable TABLE(WeekOrder INT,FirstDay DATETIME , EndDay DATETIME)ASBEGIN    DECLARE   @tmpDate   DATETIME DECLARE   @index         INT SET       @tmpDate=@tmpDateSTART SET       @index=1     WHILE     @tmpDate <=@tmpDateEND        BEGIN              INSERT INTO @tmpTable                SELECT @index,a.FirstDay,b.EndDay FROM (                        SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 0) AS FirstDAy) a                LEFT JOIN (                    SELECT 1 AS ID,DATEADD(wk, DATEDIFF(wk,0,@tmpDate), 6) AS EndDay) b                ON a.ID = b.ID          SET   @tmpDate=DATEADD(DAY,7,@tmpDate)          SET   @index=@index+1         END      RETURNEND
SELECT * from  My_Range_GetWeekFirstAndEndDays('2011-09-01','2011-10-06')

不使用临时表:

DECLARE @tmpDateSTART   DATETIMEDECLARE @tmpDateEND   DATETIMESET @tmpDateSTART = '2015-1-1'SET @tmpDateEND = '2015-1-21'DECLARE @tmpDate   DATETIMEDECLARE @days   INTSET @tmpDate = @tmpDateSTARTSET @days = 0WHILE @tmpDate <= @tmpDateENDBEGIN     DECLARE @theDate   DATETIME;   SET @theDate = DATEADD (wk, DATEDIFF (wk, 0, @tmpDate), 6);   IF @theDate > @tmpDateSTART AND @theDate < @tmpDateEND            SET @days = @days + 1     SET @tmpDate = DATEADD (DAY, 7, @tmpDate)ENDSELECT @days

7.查看正在执行的
SELECT [Spid] = session_Id,       ecid,       [Database] = DB_NAME (sp.dbid),       [User] = nt_username,       [Status] = er.status,       [Wait] = wait_type,       [Individual Query] =          SUBSTRING (             qt.text,             er.statement_start_offset / 2,               (  CASE                     WHEN er.statement_end_offset = -1                     THEN                        LEN (CONVERT (NVARCHAR (MAX), qt.text)) * 2                     ELSE                        er.statement_end_offset                  END                - er.statement_start_offset)             / 2),       [Parent Query] = qt.text,       PRogram = program_name,       Hostname,       nt_domain,       start_time,       datediff (second, start_time, getdate ())  FROM sys.dm_exec_requests er       INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid       CROSS APPLY sys.dm_exec_sql_text (er.sql_handle) AS qt WHERE session_Id > 50                                 -- Ignore system spids.                      AND session_Id NOT IN (@@SPID) -- Ignore this current statement.ORDER BY datediff (second, start_time, getdate ()) DESC
8.生成GUID

C#中用Guid.NewGuid().ToString()

Sql中用NEWID()

以上方法生成的是36位的GUID,如果需要转换成32位,则需要替换掉其中的'-'字符。

Sql中的方法:replace(newid(), '-', '')

9.时间段统计
--将时间转换为小时--例如8:22分转换为9--查询语句如下SELECT cast (          datepart (             hh,             dateadd (                mi,                  (    datediff (mi,                                 CONVERT (VARCHAR (10), getdate (), 112),                                 getdate ())                     / 60                   + 1)                * 60,                CONVERT (VARCHAR (10), getdate (), 112))) AS INT)

http://bbs.csdn.net/topics/190127317--环境declare @t table (时间 datetime,金额 int)insert @t select    '2007-1-1 10:00:23',           8 union all select    '2007-1-1 10:01:24',           4 union all select    '2007-1-1 10:05:00',           2   union all select    '2007-1-1 10:06:12',           3 union all select    '2007-1-1 10:08:00',           1 union all select    '2007-1-1 10:12:11',           5 select dateadd(mi,(datediff(mi,convert(varchar(10),时间,112),时间)/5+1)*5,convert(varchar(10),时间,112)) as 时间段,count(*) as 行数,sum(金额) as 总金额from @tgroup by dateadd(mi,(datediff(mi,convert(varchar(10),时间,112),时间)/5+1)*5,convert(varchar(10),时间,112))--结果时间段                                                    行数          总金额         ------------------------------------------------------ ----------- ----------- 2007-01-01 10:05:00.000                                2           122007-01-01 10:10:00.000                                3           62007-01-01 10:15:00.000                                1           5(所影响的行数为 3 行)
10.存储过程,有时执行很慢

现在的解决办法是,将存储过程中加个空格,alter一下。

exec 存储过程 with recompile

http://bbs.csdn.net/topics/340185343

http://my.oschina.net/HenuToater/blog/177175

http://havebb.com/b/post/produce-suddenly-slow.aspx

http://www.cnblogs.com/luckylei66/archive/2012/07/30/2615000.html

    SQL优化之存储过程强制编译         asp.net调用SQL后台存储过程时,有时突然就变得很慢,在后台直接执行存储过程没问题,但在前台调用存储过程时就是很慢,而且在前台调用成功后,再次调用还是一样的慢,但更新一下存储过程再调用就很快了。但这始终不能彻底解决问题,过段时间又会出来同样的问题。环境(NET4.0+SQL2008R2)          解决办法:          方法一:在可能比较耗时的语句后面加上option(recompile)          方法二:强制编译存储过程          SQL Server 提供三种重新编译存储过程的方法:          (1)、sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。           示例:exec sp_recompile 存储过程名          (2)、创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。           示例:Create Proc 存储过程名 WITH RECOMPILE AS 参数          (3)、在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。      示例:存储过程名 WITH RECOMPILE
查看详细

参数探测(Parameter Sniffing)与影响计划重用的SET选项

http://www.cnblogs.com/bigholy/archive/2011/10/18/2216489.html

SQL Server中存储过程比直接运行SQL语句慢的原因

http://blog.csdn.net/emili/article/details/2192081

在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点:1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据 库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL语句和程序代码语句的分离,可以提高程序代码的 可读性。3.       存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。4.       安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:A.       系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。B.       扩展存储过程 以XP_开头,用来调用操作系统提供的功能exec master..x
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表