ITPub博客

首页 > 数据库 > SQL Server > mssql论坛集锦

mssql论坛集锦

原创 SQL Server 作者:sqysl 时间:2009-01-28 21:51:28 0 删除 编辑


一、
题目:请教复杂SQL问题
我有两个表, 假如数据如下
表1
ID     A     B                                  
--------------                                  
1      A1   B1                                  
1      A2   B2                                  
表2
ID          C        D
-----------------------
1           C1      D1
1           C2      D2
1           C3      D3
请问我有什么办法,可以将上面两个表的数据,查询得到如下
同一个ID,有时表1的行数多,有时表2的行数多
ID     A     B     C        D
------------------------------------
1      A1   B1   C1      D1
1      A2   B2   C2      D2
1                    C3      D3
解决:
select identity(int,1,1) rid,id,a,b into #t1 from 表1;
select identity(int,1,1) rid,id,a,b into #t2 from 表2;
select a.id,a.a,a.b,b.c,b.d from #t1 a full join #t2 b on a.rid=b.rid order by b.rid;
二、
题目:为什么then @sum=@sum+1 else @sum end 有误?
declare @i smallint
declare @sum int
set @i=1
set @sum=0
while @i<=8
  begin
  select cno,  case when
    'F'+cast(@i as varchar(3))='T' then @sum=@sum+1 else @sum end Tsum
    from tb2
    set @i=@i+1
end
**************
服务器: 消息 170,级别 15,状态 1,行 8
第 8 行: '=' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,行 11
在关键字 'end' 附近有语法错误。
****************
解决:
declare @i smallint
declare @sum int
set @i=1
set @sum=0
while @i<=8
begin
  select cno,  case when
    'F' + cast(@i as varchar(3)) = 'T'
    then @sum + 1 else @sum end Tsum
  from tb2

  set @i=@i+1

end
三、
题目:SQL2000完全备份策略请教
我想请教个问题,A数据库每周一做一次完全备份,每天做一次差异备份,然后每小时做一次日志备份。
我想问,比如我在星期三手工的做了一次完全备份,那之后的差异备份(周四到周日)就是在我手工备份的基础上产生的了?那在这一周内,如果周五如果数据出了问题,以下方法可以还原吗?
1.还原周一的完全备份,接着还原每天的连续的日志备份
2.还原周一的完全备份,还原周二的差异备份,还原周二到周五的日志备份
3.还原周三的完全备份,还原周五的差异备份,还原周五的日志备份
请问是这样吗?还有其他方法吗?
如果我在这期间手动备份了数据库,那差异备份就是在我手动备份数据库的基础上差异了?那我之前自动备份的那个数据库就不能应用差异备份恢复了,是这样吗?

解决:
恩,差异备份应该是基于上一次的完全备份基础上的,那这样来说的话,一般情况下我们就没必要手动的去备份数据库了,只用将系统自动备份的数据库转存到它处,安全起见再把差异备份和日志备份一同转存,这样就可以了吧。
下面的备份策略怎么样:
1。每周末00:00完全备份数据库
2。每天1:00差异备份数据库
3。每隔4个小时日志备份
每周为一个循环,这样的话会产生1个完全备份,7个差异备份,42个日志备份,一共就是50个备份文件。
一共有2个数据库,均为6G左右,活动不是很频繁,这样的备份策略合适吗?

我答:
不好意思,我记错了,差异备份是以最近一次全备为基础的,而且备份后系统标志的单位也不是以数据块为单位,而是以EXTENTS为单位。
合适不合适不好说,至少我觉得是安全的。其实,这么小的数据库,而且活动不频繁,我觉得有点繁琐,差异备份一般是针对很大的数据库做的,不过,个人感觉合适就是合适,对吧。
四、
问题:
一个PL/SQL语句如何转换为SQL SERVER 语句

begin
for  fm in (SELECT a.zgh,b.xm  
             FROM gzxt a,zgxx11 b  
             WHERE  a.xm is null  and a.zgh=b.zgh) loop
    update gzxt u
       set u.xm=fm.xm
     where u.zgh= fm.zgh
       and u.xm is null;
end loop;
end;
解决:
Update gzxt Set XM=b.xm
  From gzxt a Join gzxx11 b on a.zgh=b.zgh
  Where a.xm is null

测试下,没验证过
也不知道这个ORACLE对这个循环的性能能作如何优化,还是开发者喜欢玩ROW而不玩SETS
五、问题:
紧急提问,批量修改问题。
我这有个mssqlserver的数据库,其中一张表是有个字段名是docno(档案号),字段类型为int,4位,但是在实际录入数据时候,由于没有加约束和规则,可以录入5位,既10000以上的编码。现在要求把这这些1000以上的编码改为4位,请问如何改。
例如:   修改前   docno      修改后   docno
                           61051                    1051
                           61075                    1075
                           61078                     1078
我想批量一次性改正过来,请问如何编写这个语句。
谢谢!!!
解决:
update doc set docno=substring(docno,2,4);
update doc set docno=substring(cast(docno as varchar),2,4);

六、
问题:[求助]SQL字符串删除语句
SQL求助,求教一个语句:一个表,判断一个字段里面的内容,如果有含某个字符,比如含字符'a',就把该字符后面的所有内容删除.
比如一个表的TXT字段里的第一记录内容为:fair,第二记录内容为:abbe,第三记录的内容为:monday,运行语句后的各记录分别为:f,null,mond
谢谢呀!
解决:
select left(txt,CHARINDEX('a',txt)-1) from test1;
七、
问题:求救关于isnumeric问题

表table_1
字段 jg_1
值列表如下

jg_1
0.01
0.02
100.1


-
-
语句如下
select CASE isnumeric(jg_1) WHEN 1 THEN CONVERT(decimal(12, 3), jg_1) ELSE NULL  END) AS jg_num from table_1
报错
将 varchar 转换为数据类型 numeric 时出现算术溢出错误

经测试,如果是汉字,isnumeric是有用的,但是如果是-这样的字符就出错了。

那么这个语句要怎样写才能转换

[ 本帖最后由 lky9999 于 2008-8-21 11:49 编辑 ]
解决:
这样当然是可以了。
和楼主的问题还是有差别。
楼主的问题就处在了'-','+','$'等这些非NUMERIC类型的字符,在用isnumeric时,会返回1,也会按照numeric类型进行转换,这是不可能的,从而导致出错。
select CASE isnumeric(jg_1) WHEN 1 THEN CONVERT(decimal(12, 3), jg_1)   ELSE NULL  END AS jg_num
from table_1
where jg_1 not in('-','+','$');
排除这些值。
八、
问题:
如何给一个用户赋予整个数据库的权限?

捎带负责一套SQLServer的数据库。
现在,需要给一个用户赋予一个数据库中所有表的增删改查权限
                                  和所有存储过程、触发器的执行权限,
因为表很多,存储过程也有500个左右,有没有简便一些的方法,把上面的权限赋上?多谢了!

环境:Win2003 + SQL2005


__________________
芝兰生于深林,不以无人而不芳!
关注:Oracle9i/10g/11g+linux/unix+存储技术
DBA逐渐多元化了:SQL、Oracle、DB2都要搞起来!
纸上得来终觉浅,绝知此事要躬行
子在川上曰:逝者如斯夫,不舍昼夜。时间怎么过得这么快呢?
E-mail:sdusun0819@hotmail.com
解决:
老弟,别来无恙?
use test;
go
EXEC sp_addrolemember 'db_datareader', 'test';
EXEC sp_addrolemember 'db_datawriter', 'test';        
--给数据库用户db_username授予表权限;

use test;
go
select 'grant execute on '+name+' to db_username' from test.sys.triggers;
select 'grant execute on '+name+' to db_username' from test.sys.procedures where name not like 'sp%';

--执行生成的脚本,给数据库用户db_username授予触发器、过程执行权限;
仅供参考

[ 本帖最后由 sqysl 于 2009-1-24 10:36 编辑 ]


__________________
QQ:503318229
msn:sqysl@hotmail.com
Blog:sqysl.itpub.net

九:
题目:
请问如果授予一个用户只读数据库的权限

数据库为sql server 2000,一个只读数据库DBTest ,请问如何授予用户test访问只读数据的DBTest的权限?(先去除只读再添加权限的方法不算)

解决:
CREATE LOGIN tt
    WITH PASSWORD = 'tt#tt';
USE test;
CREATE USER tt_db FOR LOGIN tt;
GO
EXEC sp_addrolemember 'db_datareader', 'tt_db';
GO
十、问题

请教大家一个SQL的写法?

表名:TB
字段:channel   varchar(50) 访问频道
      visittime   varchar(50) 访问时间 库里记录保存的形式是:yyyy-mm-dd hh:mm:ss  例如:2009-02-01 16:58:30
我想统计 频道名字 为“五”的 每个小时的访问次数?就是8点、9点、10点......的访问次数?
谢谢各位!
解决:
SELECT channel,sum(CASE DATEPART(HOUR,visittime)
                WHEN 8 THEN 1
                ELSE 0 END
                ) as '8',
sum(CASE DATEPART(HOUR,visittime)
                WHEN 9 THEN 1
                ELSE 0 END
                ) as '9',
sum(CASE DATEPART(HOUR,visittime)
                WHEN 10 THEN 1
                ELSE 0 END
                ) as '10'
FROM TB
WHERE channel='五'
GROUP BY channel;




来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8484829/viewspace-544637/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
大学毕业至今,一直深耕于数据库领域20余载,擅长数据库优化、数据库分析诊断、数据库规划设计等,曾任职多家知名大型企业,多次独立承担并成功上线关键大型项目。

注册时间:2008-06-27

  • 博文量
    356
  • 访问量
    646770