我不明白SQL语句如何返回这个答案

时间:2017-03-12 20:56:19

标签: sql-server

DECLARE @EmployeeIds VARCHAR(200)

SELECT @EmployeeIds = ISNULL (@EmployeeIds + ',', '') + CAST(ID AS VARCHAR(5))
FROM tblEmployee
WHERE Gender = 'Male'

PRINT @EmployeeIds 

你知道我们如何得到1,3,4,5,6,9,10吗?我的意思是我们如何得到一个数组的答案而不是这样:

1
3
4
5
6
9
10

1 个答案:

答案 0 :(得分:4)

  

我们如何得到一个数组的答案?

它不是一个数组。它是逗号分隔的字符串。它是通过多次分配给变量@EmployeeIds生成的。 tblEmployee中与WHERE子句匹配的每一行。

@EmployeeIds以null为开头。遇到第一行,ID为1。

  @EmployeeIds= ISNULL (@EmployeeIds + ',', '') + CAST(ID AS VARCHAR(5))
≡ @EmployeeIds= ISNULL (NULL + ',', '') + '1' /*Substituting in variable and column values*/
≡ @EmployeeIds= ISNULL (NULL, '') + '1'
≡ @EmployeeIds= '' + '1'

所以@EmployeeIds在第一行之后是1

第二行已处理,ID3

  @EmployeeIds= ISNULL (@EmployeeIds + ',', '') + CAST(ID AS VARCHAR(5))
≡ @EmployeeIds= ISNULL ('1' + ',', '') + '3' /*Substituting in variable and column values*/
≡ @EmployeeIds= ('1' + ',')  + '3'
≡ @EmployeeIds= '1,3'

等等。这不是字符串连接的保证方法。它可以而且确实失败了,并且被Microsoft特别警告。

Some example warnings

未来版本将包含STRING_AGG功能。目前最好的选择是XML PATH