SQL Server查询需要使用列表中的下拉值,如何?

时间:2018-01-08 11:24:19

标签: sql sql-server

我需要的是:我有一个带有一些字段的屏幕和一个带有查询选项的下拉列表,下拉列表是我的二级规则,如价格,客户名称等。 发生了什么:无论你在下拉列表中选择什么,它总是返回相同的顺序。 ORDER BY部分是这样的:

ORDER BY

CAD.NOME_CADASTRO,
PAG.DATA_EMISSAO,
PAG.NUM_DOCTO,
PAG.DATA_VENCTO,
PAG.VALOR_TITULO,

然后我改为:

DECLARE @TESTE CHAR(1)
SET @TESTE = 'prmOrd'

'...'

ORDER BY
CASE
 @TESTE
WHEN 'N'  THEN PAG.DATA_EMISSAO
WHEN 'D' THEN  PAG.DATA_VENCTO
WHEN 'C' THEN  CAD.NOME_CADASTRO
WHEN 'V' THEN  PAG.VALOR_TITULO
END

prmOrd保存值N,D,C和V,这是下拉列表中的值在内部处理的方式。 现在它可以工作,但是在生成报告时,如果我选择N,D或V选项,它可以正常工作。当我选择C时,我收到错误状态

  

无法生成报告。无法打开DataSet.:Inprincipal

Inprincipal是我正在处理的查询的名称。一位同事告诉我把命令作为char来施放,它会解决问题,但我无法使其发挥作用。 还有另外一件奇怪的事情发生了,它在生成报告时我选择了N,D或V然后是C,除了C之外的所有内容都是在命令之后生成的,我收到了该错误消息。然后我继续关闭窗口并重新开始,如果我尝试先生成C,则错误是不同的:

  

SQL Server错误:从字符串转换日期和/或时间时转换失败。

从那里,尝试生成任何工作选项,返回此错误:

  

错误:缺少查询表名称或过程名称。

知道我该怎么做才能让它发挥作用吗?

++++++

根据要求,这是原始状态的完整查询:

SELECT 
PAG.COD_FILIAL,
PAG.COD_DOCTO,
PAG.SERIE_DOCTO,
PAG.NUM_DOCTO,
PAG.NUM_PARCELA,
PAG.QTDE_PARCELA,
PAG.DATA_VENCTO,
PAG.COD_BANCO_CAIXA,
PAG.COD_FORNECEDOR,
CAD.NOME_CADASTRO,
CAD.APELIDO,
PAG.COD_FORMA_PGTO,
PAG.VALOR_TITULO,
PAG.VALOR_SALDO,
PAG.NATUREZA_TITULO,
PAG.NUM_NOSSO_PAG,
PAG.DATA_EMISSAO,
(CASE SUBSTRING(PAG.COD_DOCTO,1,2)
      WHEN 'AD' THEN PAG.VALOR_TITULO
      ELSE -PAG.VALOR_TITULO
  END) AS VALOR_TITDC,
(CASE SUBSTRING(PAG.COD_DOCTO,1,2)
      WHEN 'AD' THEN PAG.VALOR_SALDO
      ELSE -PAG.VALOR_SALDO
  END) AS VALOR_SALDODC,
PAG.STATUS_TITULO,
PAG.OBSERVACAO
FROM 
TBTITULOPAG PAG INNER JOIN TBCADASTROGERAL CAD
    ON PAG.COD_FORNECEDOR = CAD.COD_CADASTRO 
WHERE  
 PAG.COD_FILIAL BETWEEN '100'  AND '100'  AND
 PAG.COD_DOCTO BETWEEN ''  AND 'Z'  AND
 PAG.NUM_DOCTO BETWEEN '0' AND '999999' AND
 PAG.COD_FORNECEDOR BETWEEN '0' AND '999999' AND 
 PAG.COD_FORMA_PGTO BETWEEN '0'  AND '999999' AND
 PAG.STATUS_TITULO like 'A'  AND
 PAG.NATUREZA_TITULO LIKE 'R'  AND
 PAG.DATA_EMISSAO BETWEEN '01/01/2017'  AND '12/31/2023'

ORDER BY 
CAD.NOME_CADASTRO,
PAG.DATA_EMISSAO,
PAG.NUM_DOCTO,
PAG.DATA_VENCTO,
PAG.VALOR_TITULO

1 个答案:

答案 0 :(得分:1)

case表达式的不同返回数据类型必须兼容。而是执行以下操作:

ORDER BY
CASE @TESTE WHEN 'N'  THEN PAG.DATA_EMISSAO END,
CASE @TESTE WHEN 'D'  THEN PAG.DATA_VENCTO END,
CASE @TESTE WHEN 'C'  THEN CAD.NOME_CADASTRO END,
CASE @TESTE WHEN 'V'  THEN PAG.VALOR_TITULO END

只有其中一个会产生任何订单差异。