首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

麻烦路过的帮小弟我测试下一个语句! 谢谢

2012-02-16 
麻烦路过的帮我测试下一个语句! 多谢!请务必说明下测试环境,是sql2000,还是2005,或者2008 ? 具体点更好。。。

麻烦路过的帮我测试下一个语句! 多谢!
请务必说明下测试环境,是sql2000,还是2005,或者2008 ? 具体点更好。。。。
原因??

SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T--我测试下的结果/* sql2000 sp4 的------------------------#A         $#B         $#          $sql2005 的结果不同#A         $#B         $#$              -- 这笔不一样。。。。。*/


[解决办法]

[解决办法]
占位
[解决办法]
D
[解决办法]
..
[解决办法]
SQL code
#A         $#B         $#          $
[解决办法]
Create table T(id char(10))
insert into T select 'A'
insert into T select 'B'
insert into T select 'C'

select '#'+case id when 'C' then '' else id end+'$' from T

Drop table T

--我测试下的结果
/* 
sql2000 sp4 的
------------------------
#A $
#B $
# $


*/


[解决办法]
SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from T--Drop table T(所影响的行数为 1 行)(所影响的行数为 1 行)(所影响的行数为 1 行)             ------------ #A         $#B         $#          $(所影响的行数为 3 行)
[解决办法]
结果和楼主的一样啊?
咋了?
[解决办法]
#A $
#B $
#$


sql 2008
[解决办法]
我不是路过的,我是过路的 。。
[解决办法]
莫非在2005中CHAR的没了?
[解决办法]
探讨
#A        $
#B        $
#$


sql 2008

[解决办法]
/*
version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
Mar 29 2009 10:27:29 
Copyright (c) 1988-2008 Microsoft Corporation
Standard Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)
*/


Create table T(id char(10))
insert into T select 'A'
insert into T select 'B'
insert into T select 'C'

select '#'+case id when 'C' then '' else id end+'$' from T

Drop table T

/*
#A $
#B $
#$
*/


[解决办法]
sql 2000(sp3)


------------ 
#A $
#B $
# $

(所影响的行数为 3 行)
[解决办法]
SQL code
--2005 SP3Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T/*------------#A         $#B         $#$(3 個資料列受到影響)*/ 


[解决办法]
记得FC说过一个类似的问题
[解决办法]
以前有过讨论吧
[解决办法]
就这是种串加加
[解决办法]

SQL code
----------任务完成 走路------------------------------ Author  :fredrickhu(我是小F,向高手学习)-- Date    :2009-10-14 11:51:25-- Version:--      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) --    Nov 24 2008 13:01:59 --    Copyright (c) 1988-2005 Microsoft Corporation--    Developer Edition on Windows NT 5.2 (Build 3790: Service Pack 1)------------------------------Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T/*------------#A         $#B         $#$(3 行受影响)*/
[解决办法]
SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T------------#A         $#B         $#$(3 行受影响)select @@versionMicrosoft SQL Server 2005 - 9.00.1399.06 (Intel X86)     Oct 14 2005 00:33:37     Copyright (c) 1988-2005 Microsoft Corporation    Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)(1 行受影响)
[解决办法]
SQL code
select @@versionCreate table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T----------------------------------------------------------------------------------------------------------------Microsoft SQL Server 2005 - 9.00.1399.06 (X64)     Oct 14 2005 00:35:21     Copyright (c) 1988-2005 Microsoft Corporation    Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)------------#A         $#B         $#          $
[解决办法]
从联机文档看到case语法:
CASE input_expression 
WHEN when_expression THEN result_expression 
[ ...n ] 

ELSE else_result_expression 

END 
Searched CASE function:
CASE
WHEN Boolean_expression THEN result_expression 
[ ...n ] 

ELSE else_result_expression 

END

结果类型
从 result_expressions 和可选 else_result_expression 的类型集中返回优先级最高的类型。有关详细信息,请参阅 数据类型优先级 (Transact-SQL)。


当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。如果此转换不是所支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。
SQL Server 对数据类型使用以下优先级顺序:
用户定义数据类型(最高)
sql_varian t 
xml 
datetimeoffset 
datetime2 
datetime 
smalldatetime 
date 
time 
float 
real 
decimal 
money 
smallmoney 
bigint 
int 
smallint 
tinyint 
bit 
ntext 
text 
image 
timestamp 
uniqueidentifier 
nvarchar(包括 nvarchar(max))
nchar 
varchar(包括 varchar(max))
char 
varbinary(包括 varbinary(max))


binary(最低)

[解决办法]

探讨
SQL codeselect@@versionCreatetable T(idchar(10))insertinto Tselect'A'insertinto Tselect'B'insertinto Tselect'C'select'#'+case idwhen'C'then''else idend+'$'from TDroptable T----------------------------¡­

[解决办法]

SQL 2000 SP4测试结果:
#A $
#B $
# $

[解决办法]
先看看
[解决办法]
沟沟
偶的是2005的

SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T------------#A         $#B         $#$
[解决办法]
#A $
#B $
# $

Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
[解决办法]
完美兄 分析的太对了
[解决办法]
沟沟,
我测试看了下执行计划,2000
第二步是计算那个表达式,''空格会转成与ID类型一致的空格哦,所以结果是那样的
select '#'+case id when 'C' then '' else id end+'$' from T

(所影响的行数为 1 行)

SQL code
StmtText                                                                                            ---------------------------------------------------------------   |--Compute Scalar(DEFINE:([Expr1002]='#'+If ([T].[id]='C') then '          ' else [T].[id]+'$'))       |--Table Scan(OBJECT:([lsddb2].[dbo].[T]))(所影响的行数为 2 行)
[解决办法]
因为ID列是char(10)的,而''是常量,所以case计算的结果也是char(10)的
[解决办法]
SQL code
------------#A         $#B         $#$(3 行受影响)sql 2005
[解决办法]
SQL code
------------ #A         $#B         $#          $(所影响的行数为 3 行)sql2000 sp4
[解决办法]
这个应该清楚了

SQL code
SELECT  SQL_VARIANT_PROPERTY   ('','BaseType')/*------varchar(1 行受影响)*/
[解决办法]
不对

SQL code
SELECT  SQL_VARIANT_PROPERTY   ('#','BaseType')/*------varchar(1 行受影响)*/
[解决办法]
SQL SERVER 2008
-----------------
#A $
#B $
#$


[解决办法]
在2000中确实有 
CASE WHEN 中对CHAR + VARCHAR 或二者互转的话,结果为CHAR,长度为分支中最大长度指定(避免数据丢失)
这个问题,见http://blog.csdn.net/HEROWANG/archive/2009/02/22/3921339.aspx

但是在2005中好像进行了优化。
[解决办法]
SQL code
个人看法select '#'+case id when 'C' then '' else id end+'$' from T在2000中,执行的时候,C转换为char(10),同时后面的''也会转换为10个空格,所以结果是#+10个空格+$在20005中,执行的时候,C转换为char(10),但是后面的''不会转换为1010个空格,所以结果是#$ 


[解决办法]
可能是 SQL SERVER 2000 中,为 CHAR(10) 列赋值不足 10 字节时用空格填充,作为占位。
用 DBCC PAGE 查看一下页面存储不就一目了然了。

[解决办法]
....
[解决办法]
学习。
[解决办法]
学习
[解决办法]
declare @a char(10)
set @a='A'
SELECT SQL_VARIANT_PROPERTY('#'+@a,'BaseType'),DATALENGTH('#'+@a)
/*
varchar11
*/
SELECT SQL_VARIANT_PROPERTY('#'+'A','BaseType'),DATALENGTH('#'+'A')
/*
varchar2
*/

[解决办法]

探讨
SQL codeCreatetable T(idchar(10))insertinto Tselect'A'insertinto Tselect'B'insertinto Tselect'C'select'#'+case idwhen'C'then''else idend+'$'from T--Drop table T
(所影响的行数为1 行)


(所影响的行数为1 行)


(所影响的行数为1 行)------------#A $
#B $
# $

(所影响的行数为3 行)
2000

[解决办法]
也就是说2000和2005的常量''的类型不一样?
[解决办法]
sql server 2000 在这里也许是考虑不周吧?
[解决办法]
沟沟..
[解决办法]
SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T/*sql2008------------#A         $#B         $#$*/
[解决办法]
只能显示转换''成VARCHAR或者CHAR(10)了吧
[解决办法]
探讨
各位大大,重点不是在字串相加,
重点是在 case when ...

我在前后加上 "#" 和 "$" 是为了表明 case when 出来的结果不一样

[解决办法]
探讨
各位大大,重点不是在字串相加,
重点是在 case when ...

我在前后加上 "#" 和 "$" 是为了表明 case when 出来的结果不一样

[解决办法]
只能说明sql server 2000在处理case when 和字符串相加时不够智能
[解决办法]
------------ 
#A $
#B $
# $
SQL2000 sp4
[解决办法]
SQL code
--楼上正解。--这样就一样了。select '#'+case id when 'C' then '' else cast(id as varchar(10)) end+'$' from T
[解决办法]
探讨
引用:
SQL code个人看法select'#'+case idwhen'C'then''else idend+'$'from T

在2000中,执行的时候,C转换为char(10),同时后面的''也会转换为10个空格,所以结果是#+10个空格+$
在20005中,执行的时候,C转换为char(10),但是后面的''不会转换为1010个空格,所以结果是#$


我和影哥的想法一致,
前面的#和后面$,是我为了说明问题加上去的
本身的程式是只有 case ...end 那段,我抓狂。。。要改好多地方了

可是目前还没找到官方的说法。

[解决办法]
SQL code
Create table T(id char(10)) 
insert into T select 'A'


insert into T select 'B'
insert into T select 'C'

select case id when 'C' then '' else id end as Id,
case id when 'C' then SQL_VARIANT_PROPERTY('','BaseType') else SQL_VARIANT_PROPERTY(ID,'BaseType') end as IDtype,
case id when 'C' then DataLength('') else DataLength(ID) end as IDDataLength
from T
/*
Id    IDtype  IDDataLength
---------- -------  ------------
A      char  10
B      char  10
    varchar  0
*/


[解决办法]
探讨
引用:
引用:
各位大大,重点不是在字串相加,
重点是在 case when ...

我在前后加上 "#" 和 "$" 是为了表明 case when 出来的结果不一样


你去看case语法:
从 result_expressions 和可选 else_result_expression 的类型集中返回优先级最高的类型。有关详细信息,请参阅 数据类型优先级 (Transact-SQL)。



恩,看了,但是感觉不对
SQL codecase idwhen'C'then''-- 应该是默认varcharelse id-- char(10)end
所以按online book讲的,应该出来都自动转为 varchar才对啊
但事实是,sql2000,貌似都自动转成char(10)了
而 sql2005/2008 ,则是 id 没变,还是char(10), 而''也没变,还是varchar

[解决办法]

2005,确实不会转,char还是char,varchar还是varchar

SQL code
if object_id('t') is not nulldrop table tgoCreate table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select datalength(case when id='c' then 'A' else id end) as length from t
[解决办法]
------------
#A $
#B $
#$

(3 行受影响)
sql 2005
[解决办法]
看下楼上的朋友们贴的:
SQL code
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)  Developer Edition --#$Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)  Developer Edition--#$Microsoft SQL Server 2005 - 9.00.1399.06 (X64)  Enterprise Edition (64-bit) --#          $Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Developer Edition--#          $Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) Standard Edition --#$
[解决办法]
SQL2008:

#A $
#B $
#$
[解决办法]
进来学习
[解决办法]
Create table T(id char(10))
insert into T select 'A'
insert into T select 'B'
insert into T select 'C'
select '#'+case id when 'C' then '' else id end+'$' from T
Drop table T
--2008 2003server 
#A $
#B $
#$
--2005 2003server 
#A $
#B $
#$
[解决办法]
SQL code
看来还是有区别的:看测试:Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'--2000select SQL_VARIANT_PROPERTY(case id when 'C' then '' else id end,'basetype') from T--result/*------------------------------ charcharchar(所影响的行数为 3 行)*/--2008select SQL_VARIANT_PROPERTY(case id when 'C' then '' else id end,'basetype') from T--result/*---------------------------varchar varcharvarchar(3 行受影响)*/
[解决办法]
鸟儿的结果有说服力,按联机文档应该是 varchar.
------解决方案--------------------


探讨
SQL code看来还是有区别的:看测试:Createtable T(idchar(10))insertinto Tselect'A'insertinto Tselect'B'insertinto Tselect'C'--2000select SQL_VARIANT_PROPERTY(case idwhen'C'then''else idend,'basetype')from T--result
¡­

[解决办法]
sql 2000
-------------------------
(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 1 行)


------------ 
#A $
#B $
# $

(所影响的行数为 3 行)
[解决办法]
SQLSERVER 2008 X64
---------
#A $
#B $
#$

有问题的结果了没?
[解决办法]
------------ 
#A $
#B $
# $

(3 row(s) affected)

2000 SP3
[解决办法]
我在SQL Server2000上测试结果
SQL code
(1 row(s) affected)(1 row(s) affected)(1 row(s) affected)             ------------ #A         $#B         $#          $(3 row(s) affected)
[解决办法]
shit
[解决办法]
汗一个先
[解决办法]
sql server 2008

#A $
#B $
#$

[解决办法]
也许是2000的规则或bug吧,改为
SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then N'' else id end+'$' from TDrop table T
[解决办法]
SQL code
Create table T(id char(10))insert into T select 'A'insert into T select 'B'insert into T select 'C'select '#'+case id when 'C' then '' else id end+'$' from TDrop table T
[解决办法]
很好
[解决办法]
SQL code
#A        $ #B        $ #$--SQL2005&SQL2008
[解决办法]
看看
[解决办法]
SQL code
sql2000 ------------------------#A         $#B         $#          $
[解决办法]

[解决办法]
SQL code
------------#A         $#B         $#$SQLServer2005 怎么能知道是SP几?
[解决办法]
up
[解决办法]
up
[解决办法]
学习
[解决办法]
把id列改成varchar类型,就解决了。不用改太多。

热点排行