`

Sql Server的一些特别解法

阅读更多

 

 

 

摘自:http://topic.csdn.net/u/20100421/21/0D5D791B-AAE0-4944-9410-BAFA449D4522.html

 

详见博客地址:http://blog.csdn.net/feixianxxx/archive/2010/04/21/5513256.aspx

 

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->/*---------------------------------------------------------------- -- Author :feixianxxx(poofly) -- Date :2010-04-20 20:10:41 -- Version: -- Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) Mar 29 2009 10:27:29 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 6.1 <X86> (Build 7600: ) -- CONTENT:SQL SERVER中一些特别地方的特别解法2 ----------------------------------------------------------------*/


--1.关于where筛选器中出现指定星期几的求解

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->--环境 create table test_1 ( id int, value varchar(10), t_time datetime ) insert test_1 select 1,'a','2009-04-19' union select 2,'b','2009-04-20' union select 3,'c','2009-04-21' union select 4,'d','2009-04-22' union select 5,'e','2009-04-23' union select 6,'f','2009-04-24' union select 7,'g','2009-04-25' go 我们一般通过 datepart(weekday )进行求解,比如求解星期2的记录 select * from test_1 where DATEPART(WEEKDAY,t_time+@@DATEFIRST-1)=2 /* id value t_time ----------- ---------- ----------------------- 3 c 2009-04-21 00:00:00.000 */ 这里涉及到 @@datefirst 这个系统变量,一般我们用来调节不同地方的日期习惯。 如果你觉得关于这个变量很难也懒得去依赖它调节,这里还有一种方法 你可以使用一个参照日期,通过相同星期数成7的倍数的原理进行查询 select * from test_1 where DATEDIFF(DAY,'1900-01-02',t_time)%7=0 /* id value t_time ----------- ---------- ----------------------- 3 c 2009-04-21 00:00:00.000 */



--2.关于在where筛选器中指定大小写查找的索引引用问题

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->--环境 --drop table test_2 create table test_2 ( id int identity(1,1), value varchar(10) ) insert test_2 select 'abc' union all select 'Abc' union all select 'ABC' union all select 'aBc' go create clustered index in_value on test_2(value) --我先要查找 值为'ABC'的记录 要区分大小写的 select * from test_2 where value COLLATE CHINESE_PRC_CS_AS ='ABC' 按CTRL+L看执行计划 发现时聚集索引扫描 这就说明它不是SARG,不考虑使用索引 解决方法: select * from test_2 where value COLLATE CHINESE_PRC_CS_AS ='ABC' and value='ABC' go 看执行计划,结果是聚集索引查找;




--3.自动全局临时表

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->在某些情况下,你可能需要跨会话的维护一些共享值,这里可以通过一些手段自动建立这样一个全局临时表够你使用 具体方法就是在master数据库中建立一个以sp_开头的特殊存储过程,并且使用'startup'标志此存储过程,这样每次重启数据库后都会自动运行此存储过程, 通过在存储过程中建立全局临时表,就达到了共享全局表的目的。 create procedure sp_Create_Global as create table ##Global ( name varchar(50), value sql_variant ) go sp_procoption 'sp_Create_Global','startup','true' go cmd->net stop mssqlserver cmd->net start mssqlserver insert ##Global values('var_1','987abc') select * from ##Global




--4.关于EXEC不支持动态批处理输出参数的解决方法

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->动态批处理中 EXEC 不像 sp_executesql 一样提供接口(这里就讲输出参数) 但是也有方法去解决这个问题 --环境: create table test_3 ( id int identity(1,1), value int ) insert test_3 select 1 union select 5 union select 9 go 1.全部写入动态字符串中 exec ( 'declare @n int select @N=count(*) from test_3 select @N ' ) 2.INSERT EXEC 形式 create table #cnt(n int) insert #cnt exec('select count(*) from test_3 ') declare @cnt int set @cnt=(select N from #cnt) select @cnt 3.动态批处理直接导入临时表 create table #cnt_2(n int) exec ( 'insert #cnt_2 select count(*) from test_3' ) declare @cnt int set @cnt=(select N from #cnt) select @cnt



--5.以十六进制的格式表示的二进制字符串转成二进制值

SQL code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->你可能会尝试直接转化 select CAST('Ox0123456abcd' as varbinary(110)) /*0x4F783031323334353661626364*/ 这里因为是字符串 所以值都是ASCII值再转化,所以并不是你想要的,下面是通过动态来解决这个转化 Declare @sql nvarchar(4000),@er varbinary(1000),@s varchar(1000) --设置十六进制的数字表示的二进制字符串 set @s='0x0123456abcd'; set @sql=N'set @n='+@s exec sp_executesql @sql,N'@n varbinary(1000) output',@n=@er output select @er /*0x00123456ABCD*/ --下面尝试用这个方法 将二进制的值转化成字符串 Declare @sql2 nvarchar(4000),@er2 varbinary(1000),@s2 varchar(1000) --设置十六进制的数字表示的二进制字符串 set @er2=0x0123456abcd; set @sql2=N'set @n='''+@er2+'''' exec sp_executesql @sql2,N'@n varchar(1000) output',@n=@s2 output select @s2 /*数据类型 nvarchar 和 varbinary 在 add 运算符中不兼容。。*/ 再尝试直接转化。。 declare @er3 varbinary(1000),@s3 varchar(2000) set @er3=0x0123456abcd; select convert(varchar(1000),@er3) /*
分享到:
评论

相关推荐

    sqlserver试题含答案.doc

    SQL Server试题含答案 一、简答题 1.1 SQL Server服务器中,给定表table1中有两个字段ID、LastUpdateDate,ID表示更新的事务号,LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号。 ...

    mysql server sql面试题

    MySQL Server SQL面试题涵盖了许多核心概念,包括子查询、聚合函数、删除重复记录、联接操作、条件过滤以及窗口函数。下面将详细解释这些知识点: 1. **子查询**: - 题目1中,用一条SQL语句查询出每门课都大于80...

    SQL Server数据库教学方法探索.docx

    SQL Server数据库是计算机科学领域的重要组成部分,特别是在职业教育中扮演着不可或缺的角色。然而,由于其理论性强,对于中职学生来说可能存在一定的学习困难。本文作者林海燕探讨了几种提升学生学习SQL Server...

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    书中充满了此种结合不同技术的意想不到之解法,让懂得关键之人顿感妙趣横生,不懂奥妙之人,仍可借鉴引用。

    SQL练习题.pdf

    这份文件包含六个 SQL 练习题,涵盖了多种数据库管理系统,包括 MySQL、MS-SQL Server 和 Oracle。下面是对每个问题的详细解释和解决方案: 问题 1 写出一条 SQL 语句:取出表 A 中第 31 到第 40 记录 解决方案: ...

    sqlserver 此数据库没有有效所有者错误的解决方法

    某一天,在调试程序时突然发现,在附加数据库后...在csdn中找了半天,有个同志给出了第二种解法,使用ssms。具体在SSMS中运行以下命令: Alter AUTHORIZATION ON database::mydbname TO sa 把mydbname修改为实际的数据

    SQL语言教学的研究与实践.pdf

    例如,在SQL Server 2000中,一些特定的集合操作(如Intersect、Except)不能直接使用,而必须通过其他方式实现。为了适应实际的数据库环境,教师需要对教材中的例题进行适当的调整。 为了增强学生的实践能力,文章...

    浅谈中职SQL语言教学设计.pdf

    文章以SQL Server 2000为例,指出教材中某些例题的实现方式在实际环境中无法直接应用。例如,教材中用到的交集操作`Intersect`和差集操作`Except`在SQL Server 2000中需要转化为其他形式才能执行。比如,查询选修了...

    数值模拟小工具(数据库SQL 2000)

    6. **数据存储与查询**:学习如何与SQL Server 2000进行数据交互,包括如何建立数据库连接,执行SQL语句以及处理结果集,对于充分利用此工具至关重要。 总的来说,这个“数值模拟小工具”结合了Java编程、数值计算...

    sql 遞迴寫法 (webcs cs department 如何知道最上層department)1

    在MS SQL Server中,我们可以使用Common Table Expression (CTE) 结合递归来实现这个功能。以下是几种不同的解决方案: **解法1:列出某个部门代码以上的所有部门** ```sql WITH unitLevel AS ( SELECT id, code, ...

    SQL 合并多行记录的方法总汇

    2. **SQL Server 2005/2008及更高版本的新解法** 随着SQL Server版本的更新,引入了一些新的聚合和XML函数,使得合并多行记录变得更简单。 - 方法一使用`OUTER APPLY`结合子查询,首先获取所有不同的`id`,然后...

    SQL面试题.doc

    #### 面试题7: SQL Server 最后更新事务号获取 ```sql SELECT ID FROM table1 WHERE LastUpdateDate = (SELECT MAX(LastUpdateDate) FROM table1) ``` 此SQL语句用于查询表`table1`中最后更新的事务号,通过子查询找...

    sql50:经典SQL练习题,已适配MySQL8.0,练手和复习都很不错

    原版用的是Sql Server,在这里我重写了一些语句,改成了我用的MySQL 8.0版本,同时加了一些我自己的编程习惯 使用根目录下的create_db.sql创建完整的数据库,一共4张表,36行专门设计的数据 sql源码位于src/文件夹,...

    地铁盾构隧道洞门钢环精密检测与数据处理方法研究.pdf

    C#是一种强大的面向对象的编程语言,适合开发复杂的桌面和网络应用程序,而SQL Server则提供了可靠的数据存储和处理能力,可以高效地管理大量测量数据。通过这种方式,可以快速地处理和分析由Leica TM30测量机器人...

    数据库系统概念第五版 实践习题与习题答案

    学生可以通过模仿或改进这些答案,增强自己在数据库管理系统(如MySQL、Oracle、SQL Server等)上的实际操作经验。 "习题答案.rar"文件则可能包含了所有理论习题的解答,帮助学生核对自己的答案,理解解题过程,找...

    MySQL误操作后如何快速恢复数据

     传统解法  用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态。然后跳过误操作的SQL,再继续应用binlog。此法费时费力,不值得再推荐。  利用binlog2sql快速闪回  首先,确认你的MySQL ...

    计算机三级数据库历年真题

    2. 数据库管理系统(DBMS):了解常见的DBMS,如Oracle、MySQL、SQL Server、Access等,以及它们的特点和应用场景。理解数据库管理系统的主要功能,如数据存储、事务管理、并发控制、安全性、备份与恢复等。 3. ...

    《visual basic6.0程序设计实用教程(第2版)》

    在编程题目部分,可能包括了更复杂的项目,如数据库访问(使用ADO组件连接到Access或SQL Server)、图形绘制、多线程编程、网络通信等高级主题。这些实践项目将全面提升读者的编程能力和问题解决能力,使他们能够...

    仓库管理系统 课程设计报告

    同时,本系统也使用 SQL Server 2005 数据库平台,提供了企业级的数据管理,能够提供更安全可靠的存储功能。 仓库管理系统分析 仓库管理系统的主要目的是解决仓库管理中的问题,例如货物的存入记录与取出记录不...

Global site tag (gtag.js) - Google Analytics