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 @days7.查看正在執行的
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 ()) DESC8.生成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時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用??梢詷O大的提高數據 庫的使用效率,減少程序的執行時間,這一點在較大數據量的數據庫的操作中是非常重要的。在代碼上看,SQL語句和程序代碼語句的分離,可以提高程序代碼的 可讀性。3. 存儲過程可以設置參數,可以根據傳入參數的不同重復使用同一個存儲過程,從而高效的提高代碼的優化率和可讀性。4. 安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權存儲過程的種類:A. 系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,如 sp_help就是取得指定對象的相關信息。B. 擴展存儲過程 以XP_開頭,用來調用操作系統提供的功能exec master..x
新聞熱點
疑難解答