选择$(美元符号)

时间:2015-05-22 22:47:42

标签: sql sql-server select

我在SQL Server方面有很好的经验, 但突然间我发现了这个奇怪的SELECT命令

SELECT $ 

SELECT $ FROM tableName

它一直返回零标量值(0.00), 或所有值为0.00

的新列 那是什么?

3 个答案:

答案 0 :(得分:23)

当SQL Server遇到$符号时,它会自动将其转换为money数据类型。由于美元符号后没有显式值,因此SQL Server假定为​​0.00。来自MSDN

  

转换为moneysmallmoney时,假设整数为货币单位。例如,整数值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