麻烦路过的帮我测试下一个语句! 多谢!
请务必说明下测试环境,是sql2000,还是2005,或者2008 ? 具体点更好。。。。
原因??
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 $#$ -- 这笔不一样。。。。。*/
#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 $
# $
*/
[解决办法]
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的没了?
[解决办法]
--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说过一个类似的问题
[解决办法]
以前有过讨论吧
[解决办法]
就这是种串加加
[解决办法]
----------任务完成 走路------------------------------ 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 行受影响)*/
[解决办法]
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 行受影响)
[解决办法]
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(最低)
[解决办法]
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 行)
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)的
[解决办法]
------------#A $#B $#$(3 行受影响)sql 2005
[解决办法]
------------ #A $#B $# $(所影响的行数为 3 行)sql2000 sp4
[解决办法]
这个应该清楚了
SELECT SQL_VARIANT_PROPERTY ('','BaseType')/*------varchar(1 行受影响)*/
[解决办法]
不对
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中好像进行了优化。
[解决办法]
个人看法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
*/
[解决办法]
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)了吧
[解决办法]
--楼上正解。--这样就一样了。select '#'+case id when 'C' then '' else cast(id as varchar(10)) end+'$' from T
[解决办法]
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
*/
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
[解决办法]
看下楼上的朋友们贴的:
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 $
#$
[解决办法]
看来还是有区别的:看测试: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.
------解决方案--------------------
(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吧,改为
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
[解决办法]
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 $ #$--SQL2005&SQL2008
[解决办法]
看看
[解决办法]
sql2000 ------------------------#A $#B $# $
[解决办法]
顶
[解决办法]
------------#A $#B $#$SQLServer2005 怎么能知道是SP几?
[解决办法]
up
[解决办法]
up
[解决办法]
学习
[解决办法]
把id列改成varchar类型,就解决了。不用改太多。