不过好像sql是不支持boolean类型的。
解决方案 »
- 求教-合并两张表
- SQL触发器调用外部程序
- 在前台进行查询时,可不可以知道后台SQL要运行的语句或存储过程!高手赐教
- 的SQL语句如何写,实在不知如何下手
- 排名次遇到新问题!需要按年级,科类分组,并且还要有班级名次,年级名次!请大家一定进来看看我的代码,麻烦你们了!
- 在存储过程中top为传进来的可变值怎么拼接才不报错?
- 触发器的问题,为什么我这个触发器有错误呢?帮我看看!谢谢!
- sql server 数据库的逻辑数据类型是 bit 吗?
- (在线请教)请问怎样比较datetime型的数据?SQLSERVER2000的中
- 新手问一个关于事务操作的问题,请多多指教!
- 不同实例访问求助。。在线等!!
- 存储过程并发访问造成脏数据求解
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GOALTER PROCEDURE [dbo].[c_DueConscriptionQueue]
@ID INT
AS
IF NOT EXISTS ( SELECT [ID]
FROM [Conscription_Queue]
WHERE [ID] = @ID
AND [Completed] = 0 )
BEGIN
RETURN 0
END
DECLARE @TroopID INT
DECLARE @VillageID INT
DECLARE @UnitTraining INT
DECLARE @NextUnit DATETIME
DECLARE @Total INT DECLARE @Count INT SELECT @VillageID = [VillageID], @TroopID = [TroopID], @NextUnit = [NextUnit], @UnitTraining = [UnitTraining], @Total = [Total]
FROM [Conscription_Queue]
WHERE [ID] = @ID IF ( @UnitTraining <> 0 )
BEGIN
SET @Count = DATEDIFF(s, @NextUnit, GETDATE()) / @UnitTraining + 1
END
ELSE
BEGIN
RETURN 0
END --检查是否已存在兵种,不存在新增,存在 增加数量
IF NOT EXISTS ( SELECT *
FROM [Village_Troops]
WHERE [VillageID] = @VillageID
AND [InVillageID] = @VillageID
AND [TroopID] = @TroopID
AND [GarrisonType] = 1 )
BEGIN
IF ( @Count > @Total )
BEGIN
SET @Count = @Total
END
INSERT INTO [Village_Troops] ( [TroopID], [quantity], [VillageID], [InVillageID], [GarrisonType] )
VALUES ( @TroopID, @Count, @VillageID, @VillageID, 1 )
END
ELSE
BEGIN
IF ( @Count > @Total )
BEGIN
SET @Count = @Total
END
UPDATE [Village_Troops]
SET [quantity] = [quantity] + @Count
WHERE [VillageID] = @VillageID
AND [TroopID] = @TroopID
AND [InVillageID] = @VillageID
AND [GarrisonType] = 1
END
--增加耗粮
/*
DECLARE @Upkeep INT
SELECT @Upkeep = [Upkeep]
FROM Troops
WHERE ID = @TroopID
*/UPDATE [Villages]
SET [TroopsUpkeep] = [TroopsUpkeep] + (SELECT [Upkeep] FROM Troops
WHERE ID = @TroopID) * @Count
WHERE [TileID] = @VillageID
IF ( @Count >= @Total ) --检查是否造完
BEGIN
UPDATE [Conscription_Queue]
SET [Total] = 0, [Completed] = 1
WHERE [ID] = @ID
END
ELSE
BEGIN
UPDATE [Conscription_Queue]
SET [NextUnit] = DATEADD(ss, @UnitTraining * @Count, @NextUnit),
[Total] = [Total] - @Count
WHERE [ID] = @ID
AND [Total] > 0
END
存储过程里面有变量咋办呢?整个存储过程里面有读有写,选select语句只优化查询么?
+ CASE WHEN deqs.statement_start_offset = 0
AND deqs.statement_end_offset = -1
THEN '-- see objectText column--'
ELSE '-- query --' + CHAR(13) + CHAR(10)
+ SUBSTRING(execText.text, deqs.statement_start_offset / 2,
( ( CASE WHEN deqs.statement_end_offset = -1
THEN DATALENGTH(execText.text)
ELSE deqs.statement_end_offset
END ) - deqs.statement_start_offset ) / 2)
END AS queryText ,
deqp.query_plan
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText
CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) deqp
WHERE execText.text LIKE '%存储过程名%'
+ CASE WHEN deqs.statement_start_offset = 0
AND deqs.statement_end_offset = -1
THEN '-- see objectText column--'
ELSE '-- query --' + CHAR(13) + CHAR(10)
+ SUBSTRING(execText.text, deqs.statement_start_offset / 2,
( ( CASE WHEN deqs.statement_end_offset = -1
THEN DATALENGTH(execText.text)
ELSE deqs.statement_end_offset
END ) - deqs.statement_start_offset ) / 2)
END AS queryText ,
deqp.query_plan
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText
CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) deqp
WHERE execText.text LIKE '%c_DueConscriptionQueue%'用这个试试
deqp.objectid ,
CAST(detqp.query_plan AS XML) AS singleStatementPlan ,
deqp.query_plan AS batch_query_plan ,
--this won't actually work in all cases because nominal plans aren't
-- cached, so you won't see a plan for waitfor if you uncomment it
ROW_NUMBER() OVER ( ORDER BY Statement_Start_offset ) AS query_position ,
CASE WHEN deqs.statement_start_offset = 0
AND deqs.statement_end_offset = -1
THEN '-- see objectText column--'
ELSE '-- query --' + CHAR(13) + CHAR(10)
+ SUBSTRING(execText.text,
deqs.statement_start_offset / 2,
( ( CASE WHEN deqs.statement_end_offset = -1
THEN DATALENGTH(execText.text)
ELSE deqs.statement_end_offset
END ) - deqs.statement_start_offset )
/ 2)
END AS queryText
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_text_query_plan(deqs.plan_handle,
deqs.statement_start_offset,
deqs.statement_end_offset)
AS detqp
CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText
WHERE deqp.objectid = OBJECT_ID('ShowQueryText', 'p');
SELECT deqp.dbid ,
deqp.objectid ,
CAST(detqp.query_plan AS XML) AS singleStatementPlan ,
deqp.query_plan AS batch_query_plan ,
--this won't actually work in all cases because nominal plans aren't
-- cached, so you won't see a plan for waitfor if you uncomment it
ROW_NUMBER() OVER ( ORDER BY Statement_Start_offset ) AS query_position ,
CASE WHEN deqs.statement_start_offset = 0
AND deqs.statement_end_offset = -1
THEN '-- see objectText column--'
ELSE '-- query --' + CHAR(13) + CHAR(10)
+ SUBSTRING(execText.text,
deqs.statement_start_offset / 2,
( ( CASE WHEN deqs.statement_end_offset = -1
THEN DATALENGTH(execText.text)
ELSE deqs.statement_end_offset
END ) - deqs.statement_start_offset )
/ 2)
END AS queryText
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_text_query_plan(deqs.plan_handle,
deqs.statement_start_offset,
deqs.statement_end_offset)
AS detqp
CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText
WHERE deqp.objectid = OBJECT_ID('c_DueConscriptionQueue', 'p');执行完后什么都没有!
ctrl+M 再执行exec c_DueConscriptionQueue @id=输入一个ID
ctrl+M是什么快捷键呢?什么都木有。。直接执行后面的语句,结果如下:
表 'Conscription_Queue'。扫描计数 0,逻辑读取 3 次,物理读取 2 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
http://database.51cto.com/art/201108/284646.htm但是执行出来的和文章里面说的不一样。
老大,ctrl+l是打开执行计划的吧!
你看看这个:
怎么看出是否快了?执行 exec c_DueConscriptionQueue @id=1 ???执行结果如下:
exec c_DueConscriptionQueue @id=1
参考:http://database.51cto.com/art/201108/284646.htm基本都试过了,按照文章上来的。--建聚集索引
CREATE CLUSTERED INDEX INDEX_Userid ON T_UserInfo (Userid)
--建非聚集索引
CREATE NONCLUSTERED INDEX INDEX_Userid ON T_UserInfo (Userid)
--删除索引
DROP INDEX T_UserInfo.INDEX_Userid
--显示有关由Transact-SQL 语句生成的磁盘活动量的信息
SET STATISTICS IO ON
--关闭有关由Transact-SQL 语句生成的磁盘活动量的信息
SET STATISTICS IO OFF
--显示[返回有关语句执行情况的详细信息,并估计语句对资源的需求]
SET SHOWPLAN_ALL ON
--关闭[返回有关语句执行情况的详细信息,并估计语句对资源的需求]
SET SHOWPLAN_ALL OFF