将VB6过程转换为SQL查询-Unable找到错误

时间:2014-10-11 07:23:56

标签: sql sql-server

我正在尝试将VB6程序转换为SQL查询。

我非常喜欢 SQL ,并且在我尝试构建的查询中发现很难找到ERROR

请指导:

    SELECT *
    FROM Vault
    WHERE (Vault.[Cheque No] Like "*" & [Forms]![frmClientSearch]![txtChqNo] & "*")      
        AND (([Forms]![frmClientSearch]![txtContractNumber] Is Null) OR (Vault.[Contract Number] Like "*" & [Forms]![frmClientSearch]![txtContractNumber] & "*" )) 
        AND  (([Forms]![frmClientSearch]![txtStartDate] is NULL ) OR (Vault.[Cheque Date] >=  [Forms]![frmClientSearch]![txtStartDate] )) 
        AND (([Forms]![frmClientSearch]![txtEndDate]  is NULL  ) OR (Vault.[Cheque Date] <=  [Forms]![frmClientSearch]![txtEndDate] ))

这是我正在尝试运行的查询。当日期不为空时,这会完美执行。但是,当日期字段为空时。我得到异常或SQL给出一个空白输出。

1 个答案:

答案 0 :(得分:0)

简单回答:您无法将引用应用程序对象的VB6查询(例如[Forms]![frmClientSearch]![txtChqNo])直接转换为纯SQL Server查询。

您可以做的是创建存储过程或内联表值函数,并将表单中的值作为参数传递。

存储过程可能类似于以下代码段:

CREATE PROCEDURE dbo.Vault_Select
(
    @txtContractNumber VARCHAR(30),
    @txtChqNo   VARCHAR(30),
    @txtStartDate DATETIME,
    @txtEndDate DATETIME
)
AS
SELECT *
FROM Vault
WHERE (Vault.[Contract Number] LIKE '%' + @txtContractNumber + '%')
    AND (@txtChqNo IS NULL OR Vault.[Cheque No] LIKE '%' + @txtChqNo + '%')
    AND (@txtStartDate IS NULL OR Vault.[Cheque Date] >= @txtStartDate)
    AND (@txtEndDate IS NULL OR Vault.[Cheque Date] <= @txtEndDate)

调用sproc:

EXEC dbo.Vault_Select ('Contract', 'ChqNo', '20140120','20141022')

剩下要做的就是使用原始查询中的参数调用sproc。 由于这是一个VB6问题,我不在其中; - )

一些附注:

你要做的是一个所谓的&#34;全能查询&#34;这可能会导致性能问题,具体取决于表的大小。

此外,我想知道为什么你有一个列名[Contract Number ],但数据类型显然是字母数字。 [检查]相同...编辑:如果数据是数字,为什么需要进行通配符搜索?