防止访问搞砸了切换到设计模式时无法理解的查询

时间:2009-11-10 08:28:46

标签: ms-access

经过很长一段时间做其他事后回到Access,有一件事真的让我烦恼,那就是如果你在设计模式下无意中打开一个查询,那么设计师就无法代表sql(即使它是有效的),设计师将为您“更正”您的查询,并且没有撤消......

是否有针对此的解决方法 - 或者我可以至少让它先问我问题的选项?

(Access 2007)

2 个答案:

答案 0 :(得分:1)

这些天我倾向于在表格中存储查询。表单可用于查看查询,一些代码足以构建用于测试的查询,例如:

 CurrentDb.CreateQueryDef "TempQueryName", Me.SQL

当然,首先测试查询是否存在是明智的。

您还可以使用DLookUp这样的SQL表在代码中以及RecordSource和Control Source中使用。

答案 1 :(得分:-1)

如果您不喜欢Access UI对SQL代码的影响,为什么还要尝试在其中查看SQL?它擦除了可能已经添加的任何漂亮的格式或空白以帮助人类读者。它甚至可以将您的SQL重新分配:日期文字为美国格式,子查询为括号,PROCEDURE中的参数语法,VIEW中列相关名称丢失等等。

对您而言,更好的方法是使用SQL Data Definition Language(SQL DDL)脚本创建数据库对象,然后引用您的脚本以供将来维护。

例如,这是一个用于创建一些数据库对象的Access Database Engine SQL DDL脚本:

CREATE TABLE Constants 
(
 lock CHAR(1) WITH COMPRESSION 
    DEFAULT 'x'
    NOT NULL,
    CONSTRAINT Constants__max_one_row
       CHECK (lock = 'x'), 
 pi DECIMAL(3, 2) NOT NULL
)
;
INSERT INTO Constants (pi) VALUES (3.14)
;
CREATE TABLE Things 
(
 thing_ID CHAR(10) WITH COMPRESSION NOT NULL
    CONSTRAINT uq__Things UNIQUE, 
    CONSTRAINT thing_ID__numeric_chars_only 
       CHECK (thing_ID NOT ALIKE '%[!0-9]%'), 
 thing_name VARCHAR(20) DEFAULT '{{NONE}}' NOT NULL, 
    CONSTRAINT thing_name__whitespace
       CHECK (
              thing_name NOT ALIKE ' %'
              AND thing_name NOT ALIKE '% '
              AND thing_name NOT ALIKE '%  %'
              AND LEN(thing_name) > 0
             ) 
)
;
CREATE PROCEDURE AddThing 
(
 arg_thing_ID CHAR(10), 
 arg_thing_name VARCHAR(20) = '{{NONE}}' 
)
AS 
INSERT INTO Things (thing_ID, thing_name) 
SELECT thing_ID, thing_name
  FROM (
        SELECT RIGHT('0000000000' + arg_thing_ID, 10) AS thing_ID, 
               IIF(LEN(arg_thing_name) = 0, '{{NONE}}', arg_thing_name) 
               AS thing_name      
          FROM Constants
       ) AS DT1
 WHERE thing_ID NOT ALIKE '%[!0-9]%'
       AND thing_name NOT ALIKE ' %'
       AND thing_name NOT ALIKE '% '
       AND thing_name NOT ALIKE '%  %'
;
CREATE VIEW Stuff
(
 stuff_ID, stuff_name
)
AS 
SELECT T1.thing_ID, T1.thing_name
  FROM Things AS T1
 WHERE ' ' & T1.thing_name & ' ' ALIKE '% stuff %'
;

现在我从经验中了解到Access UI无法公开Access数据库引擎的一些功能(CHECK约束,CHAR()数据类型,WITH COMPRESSION属性等)和可能会尝试更改Query对象的SQL视图中的语法:子查询中的parens,PROCEDURE的参数 - 它将坚持调用查询 - ,{{1}的列相关名称列表 - 它将坚持也调用查询 - 等)。但谁在乎?如果我需要更改模式,我将基于SQL DDL脚本而不是Access UI认为我的脚本所说的内容。

这使我可以自由使用我选择的SQL编辑器,例如一个将关键字与数据元素分开设置,具有自动完成,缩进查询元素到我选择的等等。