【交流】SQL 2005溢用之:分拆列值
问题描述:有表tb, 如下:id values----------- -----------1 aa,bb2 aaa,bbb,ccc 欲按,分拆values列, 分拆后结果如下:id value----------- --------1 aa1 bb2 aaa2 bbb2 ccc 1. 旧的解决方法SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns bSELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)FROM tb A, # BWHERE SUBSTRING(',' + A.[values], B.id, 1)
【交流】SQL 2005溢用之:合并列值
问题描述:无论是在sql 2000, 还是在 sql 2005 中,都没有提供字符串的聚合函数, 所以, 当我们在处理下列要求时,会比较麻烦: 有表tb, 如下:id value----- ------1 aa1 bb2 aaa2 bbb2 ccc 需要得到结果:id values------ -----------1 aa,bb2 aaa,bbb,ccc 即, group by id, 求 value 的和(字符串相加) 1. 旧的解决方法-- 1. 创建处理函数CREATE FUNCTION dbo.f_str(@id int)RETURNS varchar(8000)ASBEGIN DECLARE @r varchar(8000) SET @r = '' SELECT @r = @r + ',' + value F
估计表大小(三)--估计无聚集索引的表的大小
估计无聚集索引的表的大小下列步骤可用于估计存储没有聚集索引的表上的数据和任何附加的非聚集索引所需的空间。 计算存储数据所用的空间。 计算存储每个附加非聚集索引所用的空间。 汇总计算所得的值。 对于每个计算,都要指定将在表中出现的行数。表中的行数将对表的大小有直接影响:表中的行数 = Num_Rows计算存储数据所用的空间若要计算存储数据所用的空间,请参见估计表的大小。 记下计算所得的值:存储数据所用的空间 = Data_Space_Used计算存储每个附加非聚集索引所用的空间下列步骤可用于估计没有聚集索引的表上的单个非聚集索引的
估计表的大小(二)--估计带有聚集索引的表的大小
估计带有聚集索引的表的大小下列步骤可用于估计存储带有聚集索引的表上的数据和任何附加的非聚集索引所需的空间。 计算存储数据所用的空间。 计算存储聚集索引所用的空间。 计算存储每个附加非聚集索引所用的空间。 汇总计算所得的值。 对于每个计算,都要指定将在表中出现的行数。表中的行数将对表的大小有直接影响:表中的行数 = Num_Rows计算存储数据所用的空间有关如何计算存储数据所用空间的更多信息,请参见估计表的大小。 记下计算所得的值:存储数据所用的空间 = Data_Space_Used计算存储聚集索引所用的空间下列步骤可用于估计存储
估计表的大小(一)
估计表的大小下列步骤可用于估计存储表中的数据所需的空间量。 指定表中的行数: 表中的行数 = Num_Rows如果在表的定义中有固定长度和可变长度列,请计算数据行中这两组列的每一组所占用的空间。列的大小取决于数据类型和长度说明。有关更多信息,请参见数据类型。 列数 = Num_Cols所有固定长度列中的字节总和 = Fixed_Data_Size可变长度列数 = Num_Variable_Cols所有可变长度列的最大值 = Max_Var_Size如果表中有固定长度列,行的一部分(称为空位图)将保留以管理列的可为空性。计算大小: 空位图 (Null_Bitmap) = 2 + (( Num_Cols + 7)
SQL Server 基础概念集
1、如何理解SQL Server的实例 在项目实施过程中,不少用户会有这样的需求:要求开发一套基于SQL Server的新系统,这套系统验收通过后,要和一个原有的SQL Server系统合并,共用一个服务器,所以不能为新系统提供单独的服务器(资金上不允许为开发提供单独的服务器)。但是要保障新系统的开发而又不影响旧系统的正常运行,所以要求新系统使用单独的SQL Server服务。在SQL Server 2000以前的版本中,这样的要求是无法满足的,但在SQL Server 2000中,就可以在原有SQL Server实例的基础上,再添加一个实例来解决问题。所谓的“实例”,就是一
SQL SERVER 2000 中的标识值获取函数
SQL SERVER 2000 中的标识值获取函数 IDENTITY(标识)列,也有很多人称之为自增列,在SQL Server 2000中,标识列通过IDENTITY来定义,下面是与获取最后插入记录的标识值有关的函数的一个示例说明 SQL Server 中,可以使用 SCOPE_IDENTITY()、 @@IDENTITY 、 IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:SCOPE_IDENTITY() 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位
用SQL语句来建立跟踪的问题
/*-- 下面是我用SQL的事件探察器设置跟踪,并生成的SQL脚本 现在有几个问题: 1.这个跟踪不会产生数据,用: select * from ::fn_trace_getinfo(1) 可以看到状态是在运行,但 c:test.trc 始终是空文件 2.在事件探察器中设置筛选时,ObjectType 的说明是对应 sysobjects 表的 type 列,该列是字符型,但我输入字符时 要求是数字,这个数字从那里查? 3.如果只产生对 insert,update,delete 语句成功的跟踪事件 应该如何设置呢? 在 事件探察器 中无相关设置,用语句设置的话 只找到事件号 28, 在执行 SELECT、INSERT 或 UPDATE 语句之前发生 4.用事件
导入/导出Excel
--从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*===================================================================*/--如果接受数据导入的表已经存在insert into 表 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)--如果导入数据并生成表select * into 表 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$)/*===================================================================*/--如果从SQL数据库中,导出
导入/导出dBase
从dBase文件中,导入数据到SQL数据库中,很简单,直接用下面的语句:/*===================================================================*/--如果接受数据导入的表已经存在insert into 表 select * from openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=c:','select * from [test.dbf]')--如果导入数据并生成表select * into 表 from openrowset('MICROSOFT.JET.OLEDB.4.0','dBase 5.0;DATABASE=c:','select * from [test.dbf]')/*===================================================================*/--如果从SQL数据库中
单表导入/导出文本文件
/*--实现数据导入/导出的存储过程 可以实现导入/导出 指定表 到文本文件 支持自定义行/列分隔符--邹建 2003.07(引用请保留此信息)--*//*--调用示例导出调用示例--导出指定表,这里指定导出表:地区资料exec file2table 'zj','','','c:zj.txt','xzkh_new..地区资料',@rowsplit=','导入调用示例--导入指定表,这里指定导入表:地区资料exec file2table 'zj','','','c:zj.txt','xzkh_sa..地区资料',0--*/if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1) drop procedure File2Tablegocreate
作业中使用外部数据源时发生的错误
作业中使用外部数据源时发生的错误 问题描述: 我建立了一个存储过程,是从别一台机器的ACCESS表里面取数据到本地的SQLSERVR数据库上,从五个表取数据合成一个表,表大约有六百多个字段,我在查询分析器执行存储过程一切都正常,用时2秒到二多秒,但是我把执行这句存储过程的语句做成作业,每分钟执行一次,每次执行就报作业失败。错误:作业失败。 调度 7 (gggg) 唤醒调用了该作业。最后运行的步骤是第 1 步(fffff)。. OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 报错。 [SQLSTATE 42000](错误 7399) [SQLSTATE 01000](错误 7312
DTS参数传递示例
DTS参数传递示例 -- 1. 建立测试表 CREATE TABLE tempdb.dbo.tb(id int) -- 2. 新建一个DTS包 在包中建立:a. Microsoft OLE DB Provider for SQL Server连接b. 执行 SQL 任务 任务的“SQL语句“写上: insert tb values(?) 单击“参数”按钮,打开“参数映射”对话框 单击“创建全局变量”按钮,创建一个名为value,类型为integer,值为1的全局变量 单击“确定”按钮回到“参数映射”对话框,在“参数映射”列表中,为”参数1“的”输入全局变量“选择”value" 单击“确定”按钮回到"DTS包定义”窗口c. 保存D
作业中,调用DTS包的问题
作业中调用DTS包的问题 问题描述1: 如何使用作业调度DTS包 方法: 1. 企业管理器--数据转换服务--本地包--右键你要调度的包--选择“调度包”--设置调度时间安排即可。 2. 如果直接创建作业,则应该在作业的步骤类型中选择“操作系统命令(CmdExec)",在作业的代码中,使用 DTSRun 来执行指定的DTS包。 问题描述2: 在作业中,通过查询数据库表里的某条记录的状态,如果状态符合就执行作业的下一步,去调DTS执行,这个该如何解决?方法: 把作业的类型改为TSQL,然后使用类似下面的作业代码:if exists(select * from ...
使用TableDiff实用工具解决事务复制中的问题
事务复制是数据同步中常用的一种手段,复制过程难免会遇到不少问题,就笔者遇到的问题而言,一般有两大类:一类是通过重新启动Distributor Agent即可解决的问题,另一类是因为Subscriber修改了数据,导致发布的数据有冲突,这类问题一般需要手工去修复。TableDiff是SQL Server 2005的一个命令行实用工具,该工具可以比较两个表,并且生成数据同步的脚本。借助这个工具,可以很容易地修复两个表数据不一致的问题。但如果应用该工具来解决事务复制中数据冲突的问题,则除了同步数据外,还必须解决手工同步数据后,跳过未发布的错误事务序列的
实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除
问题描述:某个基础信息表,与系统中30多个表存在外键关系,当删除基础数据时,需要判断是否已经被用过,如果用过则更改标志位,如果没有用过则直接删除,如何能很好实现这个处理?最好能够自动适应表的变化 问题解决(SQL Server 2005)-- SQL Server 2005的错误处理容易控制, 因此, SQL Server 2005中可以直接删除, 通过错误处理来确定是否需要更新. -- 示例如下.USE tempdbGO CREATE TABLE m( id int PRIMARY KEY, bz bit)INSERT m SELECT 1, 0UNION ALL SELECT 2, 0 CREATE TABLE c( id int primary key, a_id int ref
在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合
问题描述:在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合。组合的个数限制在2 和3。比如有数字(39,40,1,55,17,17……N)数字可以有重复。找出的组合有(50,50),(21,41,39),(48,50)……M。在上面的数字在组合中每次只能出现一次(比如数字中40只出现过一次,那在组合中也只能出现一次。17出现过两次那在组合中最多两次) 实现现代码-- 测试数据, value 列放要处理的数(此处随机生成100个数据)DECLARE @t TABLE( id int identity, value int)INSERT @t SELECT TOP 100 CHECKSUM(NE
SELECT 赋值与ORDER BY冲突的问题
问题描述:使用 SELECT 语句,轮询表中的数据,并且处理变量数据时,如果有ORDER BY语句,则得不到想要的结果,但去掉ORDER BY,结果正常。具体的问题表现参考下面的问题重现代码 问题重现代码-- 测试数据DECLARE @T TABLE(id int,value nvarchar(16))INSERT INTO @T SELECT 1, N'好人' UNION ALL SELECT 2, N'坏人' UNION ALL SELECT 3, N'吃饭' UNION ALL SELECT 4, N'垃圾' -- 赋值处理DECLARE @str nvarchar(4000)SET @str = N'我不是一个好人,也不是垃圾'SELECT @str = REPLACE(@str, value, N'<u>' + value + N'</
SSIS处理导入数据时, 存在的更新, 不存在的插入
问题描述:当你把数据从其他数据库, 或者是文本文件之类的其他数据源导入到目的数据库时, 有时希望在导入的处理中, 能够实现"数据存在时更新, 不存在时导入"在之前, 一般是通过导入临时表, 然后再判断处理导入正式表的, 在SQL Server 2005中, SSIS可以在导入处理时直接完成这种处理. 下面具体演示一下如何用SSIS完成这样的处理:1. 准备测试环境-- 1. 在数据库中创建下面的对象USE tempdbGO CREATE TABLE dbo.tb( id int PRIMARY KEY, name nvarchar(128))GO -- 2. 准备两个文本文件, 放在d:test 目录下, 文件的内
使用事务与锁,实现一个用户取过的数据不被其他用户取到
问题描述:用ADO访问数据库,从一个表中取一定的记录(比如20行),取出后在程序中使用,使用完后删除掉记录(不用更新或删除记录)。在多用户操作下(每个用户采用相同的操作),怎么保证一个用户已选取的记录不被其他用户选取? 问题解决:处理这类问题的一般方法是增加一个标志列,每个用户取的记录设置一个标志,新的用户只从标志为未取的记录中获取记录。而本文利用事务与锁来控制数据的处理,不需要增加任何标志列下面是具体的解决示例 1. 建立测试环境USE tempdbGO CREATE TABLE dbo.tb(id int identity(1, 1), name nvarchar(1