mssql论坛集锦

来源:这里教程网 时间:2026-03-02 10:00:38 作者:

一、 题目:请教复杂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;

相关推荐