我在SQL Server方面有很好的经验,
但突然间我发现了这个奇怪的SELECT
命令
SELECT $
或
SELECT $ FROM tableName
它一直返回零标量值(0.00
),
或所有值为0.00
答案 0 :(得分:23)
当SQL Server遇到$
符号时,它会自动将其转换为money
数据类型。由于美元符号后没有显式值,因此SQL Server假定为0.00
。来自MSDN:
转换为
money
或smallmoney
时,假设整数为货币单位。例如,整数值4将转换为相当于4美元的货币(对于us_english,默认语言)。浮点值小数点右边的数字四舍五入到货币值的四位小数。正在转换为整数数据类型的数据类型char或varchar的表达式必须仅包含数字和可选的加号或减号(+或 - )。领先的空白被忽略了。转换为货币的数据类型char或varchar的表达式还可以包括可选的小数点和前导美元符号($)。
答案 1 :(得分:12)
经过一番混乱之后,我发现无论使用什么货币符号都会发生这种情况,SQL服务器暗示该字段是货币字段。
如果您在货币符号后添加数字,在这种情况下为美元:
SELECT $4
SQL服务器将返回4.00
因此,SQL Server正在使用$并假设我们要创建一个具有 MONEY 数据类型的字段,并且由于我们没有在货币符号后面输入值,因此SQL Server假定该值是0,但在我看来这应该返回NULL。
答案 2 :(得分:1)
您可以证明SQL Server将其视为type Result struct {
Value string
Algorithm string
}
func (r *Result) String() string {
return r.Value
}
func A(in string, out chan *Result) {
out <- &Result{"A", "A"}
}
func B(in string, out chan *Result) {
out <- &Result{"B", "B"}
}
func main() {
data := []string{"foo", "bar", "baz"}
for _, datum := range data {
resultChan := make(chan *Result, 2)
expectedResult := "B"
go A(datum, resultChan)
go B(datum, resultChan)
result := <-resultChan
if result.Value != expectedResult {
fmt.Println("Unexpected result: ", result)
result = <-resultChan
}
fmt.Println("Got result: ", result)
}
}
类型:
money
select $ as n into #x
exec tempdb..sp_help '#x'
将输出(除其他外):
sp_help