簡體   English   中英

使用參數的MS Access選擇查詢失敗

[英]MS Access select query using parameters fails

我將Access DB用作經典asp網頁的后端。 我正在創建一個使用參數的保存的查詢。 我正在Access 2000的查詢生成器中進行測試。字段均為文本,默認值為NULL,[in_b]允許為零長度,其中有9個,分別為B160,B80,B40,B30等。

我的查詢是:

 SELECT COUNT([in_b]) AS BCnt FROM tblScore 
 WHERE UCALL=[in_call] and NOT ISNULL([in_b]);

這將返回給定UCALL的所有行的計數。 如果我將2 [in_b]中的任何一個更改為實際的列名,則查詢都會提供我想要的內容(在這種情況下為0),但是我必須運行9個查詢。

表例

Call  Zone B160   B80  B40
NF4L   1    NULL   X    NULL
NF4L   6    Null  Null  NULL
NF4L   20     X     X   Null
WA4B   2    NULL  NULL   X

If in_call is NF4L and in_b is B160, I expect 1
If in_call is NF4L and in_b is B80,  I expect 2
If in_call is NF4L and in_b is B40,  I expect 0

目的是獲得對給定調用不為空的所有“ B”列的計數。

在這種情況下,您使用參數([in_b])作為對列的引用,而不是實際數據值。 我認為您在這種設計上不會走得太遠。

除了構造9個不同的查詢(不要做!)之外,您還可以嘗試以下兩種其他選擇:

  1. 將表設計更改為更多的鍵值對
  2. 根據您提供的條件動態構建查詢

對於選項1,您可以將表更改為如下所示:

Call | Zone | BField | BFieldValue
NF4L | 1    | B80    | X
NF4L | 1    | B160   | NULL
NF4L | 1    | B40    | NULL
NF4L | 6    | B160   | NULL
NF4L | 6    | B80    | NULL
NF4L | 6    | B40    | NULL
NF4L | 20   | B160   | X
NF4L | 20   | B80    | X
NF4L | 20   | B40    | NULL
...

您的查詢可能如下所示:

SELECT BField, COUNT([BFieldValue]) AS BCnt 
FROM tblScore 
WHERE UCALL=[in_call] and [BFieldValue] IS NOT NULL
GROUP BY BField;

此選項是兩者中更可擴展的。 如果您需要在某個時候添加額外的“ BFields”,這樣做很簡單,但是要付出重新設計表的方式,即如何向表中添加數據。

選項2是在運行時動態構建查詢,以便您可以根據概述的條件替換實際的列名。 例如:

Dim SQL as String
Dim BField as String
Dim InCall as String

'These would typically be passed in, not hardcoded as they are here
Set InCall = "NF4L"
Set BField = "B160"

SET SQL = "SELECT Count([" & BField & "] FROM tblScore WHERE [Call] ='" & InCall & "' AND NOT ISNULL([" & BField & "]);"

'From here, either open up a recordset based on this SQL or create a new QueryDef object and execute it.

我知道使用SQL Server,您可以傳遞參數並使用CASE語句,如下所示:

SELECT COUNT(*) 
FROM Test
WHERE CASE 
   WHEN @col = 'col1'
   THEN col1 
   WHEN @col = 'col2' 
   THEN col2 END IS NOT NULL

其中@col是傳入的參數。 我認為您可以使用IIF在MS Access中做到這一點-試試看:

SELECT COUNT(*) 
FROM Test
WHERE NOT ISNULL(IIF(@col = 'col1', col1, IIF(@col = 'col2', col2, ...))

另外,您可以使用動態SQL在服務器端進行操作,但請確保使用參數化查詢。 這是一個很好的例子:

Const ad_nVarChar = 202
Const ad_ParamInput = 1

strSQL = "SELECT Count(*) FROM tblScore WHERE [Call] = ? AND NOT ISNULL(?); "

Set cmd = Server.CreateObject("ADODB.Command")    
cmd.ActiveConnection = connStr
cmd.CommandText = strSQL
cmd.CommandType = adCmdText
cmd.Parameters(0) = "NF4L"
cmd.Parameters(1) = "B160"

Set rst = cmd.Execute()

祝好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM