我需要计算此表中不同项目的数量,但不同的是存储在变量中的许多列。这是2件要求。
要求1:
SELECT COUNT(DISTINCT (CHECKSUM(code_paiement,id_emetteur,id_liaison)))
FROM [DB1].[dbo].[Vo_Fait]
要求2:
declare @var nvarchar(4000) = 'code_paiement, id_emetteur, id_liaison'
SELECT COUNT(DISTINCT (CHECKSUM(@var)))
FROM [DB1].[dbo].[Vo_Fait]
但是这2令的结果是不同的!
答案 0 :(得分:1)
在“req2”中,您将获取字符串'code_paiement,id_emetteur,id_liaison'的校验和,它将始终相同,并计算它的不同值,它始终为1.
以这种方式思考:您的代码简化为:
SELECT COUNT(DISTINCT (CHECKSUM('code_paiement,id_emetteur,id_liaison')))
FROM [DB1].[dbo].[Vo_Fait]
......与以下内容相同:
SELECT COUNT(DISTINCT (-1998057055))
FROM [DB1].[dbo].[Vo_Fait]
所以你要计算表格中每一行的数字-1998057055的不同出现次数;因为每行的值相同,所以只有一个不同的出现。
如果你真的需要动态构建你的SQL代码(通常你应该通过改变你的设计来避免这种情况),那么你应该使用exec
或sp_executesql
之类的东西。一个简单的例子:
DECLARE @var NVARCHAR(4000) = 'code_paiement,id_emetteur,id_liaison';
DECLARE @sql NVARCHAR(4000)='SELECT COUNT(DISTINCT(CHECKSUM(' + @var + '))) FROM [DB1].[dbo].[Vo_Fait]';
EXEC (@sql);