Some Test
----------------------------------------------------------------------------
-------------------------------启用CLR集成----------------------------------
----在你开始用C#写存储过程之前,必须要启用你的SQL Server的CLR集成特性,默认情况它是不启用的.
----打开你的SQL Server Management Studio并执行如下脚本
EXECUTE sp_configure 'clr enabled' -------查看状态--------
EXECUTE sp_configure 'clr enabled',1 -------两个参数:1-启用clr,0-禁用clr------
----这里,我们执行了系统存储过程“sp_configure”,为其提供的两个参数分别为:“clr enabled”和“1”.
----如果要停用CLR集成的话也是执行这个存储过程,只不过第二个参数要变为“0”而已.
----"Configuration option 'clr enabled' changed from 1 to 1. Run the RECONFIGURE statement to install."
---按提示(配置选项 'clr enabled' 已从 0 更改为 1.请运行 RECONFIGURE 语句进行安装。)
----另外,为了使新的设置产生效果,不要忘记调用“RECONFIGURE”.运行此句
RECONFIGURE
----------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
IF OBJECT_ID('Test_UserList','U') is not null
drop table [Test_UserList]
GO
CREATE TABLE [dbo].[Test_UserList] (
[TUL_ID] BIGINT IDENTITY(1,1) NOT NULL,
[TUL_NAME] nvarchar(50) NULL,
[TUL_Desc] nvarchar(200) NULL,
[TUL_level] BIGINT NULL,
[TUL_BoosID] [int] NULL
) ON [PRIMARY]
USE [MyTest]
GO
/****** Object: StoredProcedure [dbo].[UserList_INSERT] Script Date: 06/17/2008 10:56:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[UserList_INSERT]
(
@NAME NVARCHAR(50),
@DESC NVARCHAR(50),
@BOOSID BIGINT
)
AS
SET NOCOUNT ON;
DECLARE @LEVEL BIGINT;
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
SELECT @LEVEL=[TUL_level]+1 FROM [Test_UserList] WHERE [TUL_ID]=@BOOSID
IF @LEVEL=0 OR @LEVEL IS NULL
BEGIN
SET @LEVEL=1;
SET @BOOSID=0;
END
--BEGIN TRANSACTION
IF @TranCounter = 0
BEGIN TRANSACTION;
--Verify Foreign Keys
--Insert Data
DECLARE @ErrCode INT;
INSERT INTO [Test_UserList]
(
[TUL_NAME],
[TUL_Desc],
[TUL_level],
[TUL_BoosID]
)
values
(
@NAME,
@DESC,
@LEVEL,
@BOOSID
)
SET @ErrCode = @@ERROR;
IF @ErrCode = 0
BEGIN
--COMMIT TRANSACTION
IF @TranCounter = 0
IF (XACT_STATE()) = 1
COMMIT TRANSACTION
END
--ROLLBACK TRANSACTION
IF @TranCounter = 0
IF (XACT_STATE()) <> 0
ROLLBACK TRANSACTION
-------------------------------------------------------------------
dbo.UserList_INSERT 'gyf','rrrr',0;
select * from Test_UserList
WITH IamV AS(
SELECT [TUL_ID],[TUL_NAME],[TUL_Desc],[TUL_level],[TUL_BoosID]
FROM Test_UserList(NOLOCK)
WHERE [TUL_BoosID]=3
UNION ALL
SELECT a.[TUL_ID],a.[TUL_NAME],a.[TUL_Desc],a.[TUL_level],a.[TUL_BoosID]
FROM IamV z
INNER JOIN Test_UserList a on z.[TUL_ID]=a.[TUL_BoosID]
)
SELECT * from IamV
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
/*
OBJECT_ID():返回数据库对象标识号。N是显式的将非unicode字符转成unicode字符,它来自 SQL-92 标准中的 National(Unicode)数据类型,用于扩展和标准化,在这里可以不用,写作object_id(PerPersonData)。
OBJECTPROPERTY():返回当前数据库中对象的有关信息.BOOL 1表“真”。同样可以写成OBJECTPROPERTY(id,IsUserTable) = 1。
整条语句的意思是判断数据库里有没有存在PerPersonData这样一张表。
*/
--CTE是Common Table Expression的简写,翻译成中文就是通用表表达式,它可以在select,insert或者update中使用。
--为了说明问题,我们先随便建张表,插入几条数据:
--知识点:WITH AS, ROW_NUMBER(),OVER(),object_id()
--这是2005提供的一个新功能,叫CTE(公用表表达式)
--其实他就是一个临时视图,因此使用的时候必须
--1 前一个语句必须以分号结尾
--2 本质上,CTE是一个临时结果集,它仅仅存在于它发生的语句中。
-- 因此当你第二次调用他的时候必须再次声明一个CTE,这样这个CTE才存在与这个语句中
--
--与派生表不同,CTE能够引用自己本身。如果您不必存储视图,您可以用一个CTE来代替它。
--在一个语句中,您还可以多次引用CTE。应用CTE,您可以通过一个派生栏对结果进行分组。
--用CTE来实现递归是他的最大特点
if object_id('t','U') is not null --用object_id函数判断表是否在数据库中存在很简洁
drop table t;
GO
create table t(c1 int,c2 decimal,c3 int);
GO
INSERT INTO t
SELECT c1 = 1,c2 = 5.0,c3=10
UNION
SELECT c1 = 2,c2 = 5.5,c3=10
UNION
SELECT c1 = 3,c2 = 5.0,c3=20
UNION
SELECT c1 = 4,c2 = 5.5,c3=20
--下面我们使用CTE写一个分页的sql语句
GO
WITH t_cn AS
(
select c1,c2,c3,rn = ROW_NUMBER()
OVER(ORDER BY c1 DESC)
FROM t WHERE 0 = 0 --可以在此处添加一些条件
)
SELECT c1,c2,c3,rn FROM t_cn WHERE rn between 2 and 5
SELECT totalCn = COUNT(*) FROM t WHERE 0 = 0
PRINT CONVERT(NVARCHAR(50),GETDATE(),13);
WITH aab(t,b) AS
(
SELECT 1, CONVERT(NVARCHAR(50),GETDATE(),13)
UNION ALL
SELECT t+1, CONVERT(NVARCHAR(50),GETDATE(),13) FROM aab
WHERE t < 20000
)
SELECT * FROM aab
--UNION ALL
--SELECT * FROM aab
OPTION (MAXRECURSION 32767)
PRINT CONVERT(NVARCHAR(50),GETDATE(),13)
-----------------------------------------------------------
-----------------------------------------------------------
WITH ctedt(dt) AS
(
SELECT 1
UNION ALL
SELECT dt + 1 FROM ctedt
WHERE dt < 1000
),
cteds(ds) AS
(
SELECT 1000
UNION ALL
SELECT ds - 1 FROM cteds
WHERE ds >1
)
SELECT ctedt.dt,
cteds.ds
FROM cteds
INNER JOIN ctedt ON ds=dt
OPTION (MAXRECURSION 32767)
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
/*
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
*/
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT TOP 10 *
FROM UserTraces AS ut1
WHERE ActionID<>2
AND NOT EXISTS(
SELECT 1
FROM UserTraces
WHERE ExtensionID1=ut1.ExtensionID1 AND ActionID<>2 AND CreateDate>ut1.CreateDate
)
ORDER BY CreateDate DESC
SELECT TOP 10 *
FROM UserTraces AS t1
Where EXISTS
(
SELECT *
FROM UserTraces AS t2
WHERE ActionID<>2
GROUP BY ExtensionID1
HAVING ExtensionID1 = t1.ExtensionID1
and max(CreateDate) = t1.CreateDate
)
ORDER BY CreateDate DESC
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
select top 2 * from A order by newid()
SELECT NEWID()
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
--1.请问MDF和LDF文件如何还原为数据库实例?
-- 附加数据库就可以完成.
-- 附加数据库:
-- 企业管理器
-- --右键"数据库"
-- --所有任务
-- --附加数据库
-- --选择你的.mdf文件名
-- --确定
-- --如果提示没有.ldf文件,是否创建,选择"是"
-- 查询分析器中的方法:
-- --有数据文件及日志文件的情况
-- sp_attach_db '数据库名'
-- ,'数据文件名(*.mdf注意要带目录)' --后面可以是用,分隔的该数据库的多个数据文件
-- ,'日志文件名(*.ldf注意要带目录)'--后面可以是用,分隔的该数据库的多个日志文件
--
-- --如果只有数据文件的情况
-- sp_attach_single_file_db '数据库名'
-- ,'数据文件名(*.mdf注意要带目录)' --后面可以是用,分隔的该数据库的多个数据文件
--
--EXEC sp_attach_db @dbname= N'ShopData',
-- @filename1=N'E:\IamV\ShopStiteSQLDataBase\ShopData_Data.MDF',
-- @filename2=N'E:\IamV\ShopStiteSQLDataBase\ShopData_Log.LDF'
--------------------------------------------------------------------------------------
--------------------------------------------------------------
begin transaction
commit transaction
rollback transaction
select @@TRANCOUNT
select XACT_STATE()
----------------------------------------------------------------