天道酬勤,学无止境

How do I insert a mergefield into an If..else statement in VBA using Word MailMerge?

The below macro will input the field heading followed by the field value. The If statement should check the value of the field and if its greater than 30 the actual value is given, otherwise a zero.

Instead of the value appearing if it's true, I just get the actual text I've typed, not it's value.

   Sub Macro1()
      Dim doc As Word.Document
      Dim dtField As Word.MailMergeDataField
      Dim sFieldName As String
      Dim sFieldActualName As String
      Dim j As Integer

      Set doc = ActiveDocument
      j = 1

      For Each dtField In doc.MailMerge.DataSource.DataFields

        sFieldActualName = doc.MailMerge.DataSource.FieldNames(j).Name
        sFieldName = dtField.Name
        Selection.TypeText Text:=sFieldActualName + ": "
'---------------------------------------------------------------------------
            doc.MailMerge.Fields.AddIf Range:=Selection.Range, MergeField:= _
                sFieldName, Comparison:=wdMergeIfGreaterThan,_
 CompareTo:="30", TrueText:="{MERGEFIELD sFieldName}", _
                FalseText:="0"
'---------------------------------------------------------------------------
        Selection.TypeParagraph
        j = j + 1

      Next

    End Sub

Please let me know if i need to clarify anything.

Edit: Sample data I'm using from excel

one   two   three   four    five
85    50     63      50      41
52    10     84      10      15
85    25     63      35      10

评论

As far as I know, the only way to insert a nested field set is to insert the fields directly. Nested fields are tricky - there are a couple of approaches "out there", in the internet. The following is the one I use.

In this variation, the outer-most field is inserted with placeholder text for the inner field code(s). The placeholder text is the field code with typed brackets (not the Ctrl+F9 kind).

The outer field is sent to the Function GenerateNestedField along with the placeholder string. The function locates the placeholder in the field's code and inserts the real field in its place.

I had to modify my standard code to work with the fact that you're inserting a MailMergeField for the If field. It's necessary to convert the MailMergeField to a regular Word.Field which I do by selecting the inserted field, then taking the first Field in the Fields collection.

Sub IfPlusMergeField()
    Dim doc As word.Document
    Dim sFieldCode As String, sFieldName As String
    Dim fldMerge As word.MailMergeField
    Dim fldIf As word.Field

    Set doc = ActiveDocument
    sFieldName = dt.FieldName
    sFieldCode = "{Mergefield " & sFieldName & "}"
    Set fldMerge = doc.MailMerge.Fields.AddIf(Range:=Selection.Range, _
                   MERGEFIELD:=sFieldName, Comparison:=wdMergeIfGreaterThan, _
                   CompareTo:="30", TrueText:=sFieldCode, _
                   FalseText:="0")
    fldMerge.Select
    Set fldIf = Selection.Fields(1)
    Debug.Print GenerateNestedField(fldIf, sFieldCode)
End Sub

'Returns the changed field code
Function GenerateNestedField(fldOuter As word.Field, _
                             sPlaceholder As String) As String

    Dim rngFld As word.Range, doc As word.Document
    Dim bFound As Boolean
    Dim sFieldCode As String

    Set doc = fldOuter.Parent

    Set rngFld = fldOuter.code
    rngFld.TextRetrievalMode.IncludeFieldCodes = True
    bFound = rngFld.Find.Execute(findText:=sPlaceholder)
    'Get the field code from the placeholder by removing the { }
    sFieldCode = Mid(sPlaceholder, 2, Len(sPlaceholder) - 2)
    If bFound Then
        doc.Fields.Add rngFld, word.WdFieldType.wdFieldEmpty, sFieldCode, False
    End If
    'Debug.Print fldOuter.code

    GenerateNestedField = fldOuter.code
End Function

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 执行Word邮件合并(Executing Word Mail Merge)
    问题 我有一个包含数据的Excel工作表,并想将其导出到新的Word文档中。 单击表格上的按钮是否可以从excel宏启动MAIL MERGE ? 回答1 如果您的Word文档已经配置了合并字段,并且您正在从工作簿中运行包含要合并到Word文档中的数据的宏,请尝试以下操作: Sub RunMerge() Dim wd As Object Dim wdocSource As Object Dim strWorkbookName As String On Error Resume Next Set wd = GetObject(, "Word.Application") If wd Is Nothing Then Set wd = CreateObject("Word.Application") End If On Error GoTo 0 Set wdocSource = wd.Documents.Open("c:\test\WordMerge.docx") strWorkbookName = ThisWorkbook.Path & "\" & ThisWorkbook.Name wdocSource.MailMerge.MainDocumentType = wdFormLetters wdocSource.MailMerge.OpenDataSource _ Name
  • 如何使用VBA将文本插入Outlook电子邮件编辑器(How to insert text into Outlook email editor using VBA)
    问题 我希望创建一个宏,该宏将日期插入到当前已打开以供编辑的电子邮件正文中,然后再发送。 我在Windows 7计算机上使用Outlook 2013。 所需的工作流程: 点击回复电子邮件在电子邮件编辑器中,将文本光标放在电子邮件正文中所需的位置以插入文本执行宏(通过单击电子邮件编辑器窗口的快速访问工具栏中的图标)。 宏将插入日期。 (假设日期已存储为字符串变量,即宏仅将变量插入到电子邮件正文中的所需位置)。 我发现的所有将文本插入电子邮件正文的Outlook VBA示例都涉及将活动电子邮件的HTMLBody存储为字符串,将所需的文本附加到该字符串,然后创建全新的电子邮件,然后重新填充到,抄送,密件抄送,主题和htmlbody。 我希望避免这种情况,因为它似乎很笨拙。 预先感谢您的帮助。 回答1 InsertBefore方法或InsertAfter方法 Inspector.WordEditor属性(Outlook) Application.ActiveInspector方法(Outlook) 例子 Option Explicit Public Sub Example() Dim Inspector As Outlook.Inspector Dim wdDoc As Word.Document Dim Selection As Word.Selection Set Inspector
  • 从一系列文档模板生成Word文档(在Excel VBA中)(Generate Word Documents (in Excel VBA) from a series of Document Templates)
    问题 大家好。 我将尝试使这个简短而简单。 :) 我有 40个左右的样板文字文档带有一系列需要填写的字段(名称,地址等)。从历史上看,这是手动完成的操作,但是它是重复性的且麻烦的。 用户填写了大量有关个人的信息的工作簿。 我需要 一种以编程方式(从Excel VBA)打开这些样板文档,在工作簿中的各个命名范围中编辑字段的值,然后将填写的模板保存到本地文件夹中。 如果我使用VBA以编程方式编辑一组电子表格中的特定值,则我将编辑所有这些电子表格以包含一组可在自动填充过程中使用的命名范围,但是我不知道有任何“已命名” Word文档中的“字段”功能。 如何编辑文档并创建VBA例程,以便可以打开每个文档,查找可能需要填写的一组字段并替换值? 例如,工作方式如下: for each document in set_of_templates if document.FieldExists("Name") then document.Field("Name").value = strName if document.FieldExists("Address") then document.Field("Name").value = strAddress ... document.saveAs( thisWorkbook.Path & "\GeneratedDocs\ " & document
  • Word 神器 python-docx
    前两天有个朋友向我求助,她在写毕业论文时,不小心将论文里的中文双引号替换为英文的了,各种原因导致无法回退,8万多字的论文,眼看就要交了,该怎么办?首先想到 word 自身的替换功能,倒是能查到,但是没法动态替换,即只替换两边引号,而不换中间内容;另外一种方案是,即用 VBA,通过编程来替换,虽说做过几个项目,可好久不用,拾起费劲,再加上 VBA 中各种概念和用法,学习成本太高,放弃;还有一种方案,即用 Python 操作 word,首先对 Python 更熟悉,另外一定有别人造好的轮子。果然,没用多久找到了 python-docx Python 库,文档齐全,功能强大,用来解决替换问题不在话下。开始之前,先简单了解下 python-docxpython-docx 介绍python-docx 是用于创建可修改 微软 Word 的一个 python 库,提供全套的 Word 操作,是最常用的 Word 工具概念使用前,先了解几个概念:Document:是一个 Word 文档 对象,不同于 VBA 中 Worksheet 的概念,Document 是独立的,打开不同的 Word 文档,就会有不同的 Document 对象,相互之间没有影响Paragraph:是段落,一个 Word 文档由多个段落组成,当在文档中输入一个回车键,就会成为新的段落,输入 shift + 回车,不会分段Run
  • 从单元格复制时省去引号(Leave out quotes when copying from cell)
    问题 问题: 从程序外部的Excel复制单元格时,会自动添加双引号。 详细资料: 我在Windows 7计算机上使用Excel 2007。 如果我有一个具有以下公式的单元格: ="1"&CHAR(9)&"SOME NOTES FOR LINE 1."&CHAR(9)&"2"&CHAR(9)&"SOME NOTES FOR LINE 2." 单元格中的输出(格式为数字)在Excel中如下所示: 1SOME NOTES FOR LINE 1.2SOME NOTES FOR LINE 2. 好,好。 但是,如果将单元格复制到另一个程序(如记事本)中,则在开头和结尾都会出现恼人的双引号。 请注意,保留了由“ CHAR(9)”创建的选项卡,这很好。 "1 SOME NOTES FOR LINE 1. 2 SOME NOTES FOR LINE 2." 复制到另一个程序时,如何避免显示双引号? 换句话说,当单元格复制到剪贴板时,我可以阻止它们被自动添加吗? 回答1 如果您尝试粘贴到Word-Pad,Notepad ++或Word中,则不会出现此问题。 要将单元格值复制为纯文本,要实现您所描述的内容,您必须使用宏: 在要应用此代码的工作簿中(如果要在多个工作簿中使用,请在Personal.xls中)中,将以下代码放置在标准模块中: 代码: Sub CopyCellContents()
  • Programmatically extract macro (VBA) code from Word 2007 docs
    Is it possible to extract all of the VBA code from a Word 2007 "docm" document using the API? I have found how to insert VBA code at runtime, and how to delete all VBA code, but not pull the actual code out into a stream or string that I can store (and insert into other documents in the future). Any tips or resources would be appreciated. Edit: thanks to everyone, Aardvark's answer was exactly what I was looking for. I have converted his code to C#, and was able to call it from a class library using Visual Studio 2008. using Microsoft.Office.Interop.Word; using Microsoft.Vbe.Interop;
  • 如何在Microsoft Access中的不同上下文中在VBA中使用参数?(How do I use parameters in VBA in the different contexts in Microsoft Access?)
    问题 我从bobby-tables.com之类的网站上阅读了很多有关SQL注入和使用参数的信息。 但是,我正在Access中使用一个复杂的应用程序,该应用程序具有很多动态SQL,并且在各种地方都有字符串连接。 我想更改以下内容并添加参数,以避免错误并允许我使用单引号处理名称,例如Jack O'Connel。 它用: DoCmd.RunSQL执行SQL命令 DAO记录集 ADODB记录集使用DoCmd.OpenForm和DoCmd.OpenReport打开的表单和报表,在WhereCondition参数中使用字符串连接像DLookUp这样的域聚合使用字符串连接 查询的结构大致如下: DoCmd.RunSQL "INSERT INTO Table1(Field1) SELECT Field1 FROM Table2 WHERE ID = " & Me.SomeTextbox 在这些不同类型的查询中使用参数时,我有哪些选择? 此问题旨在作为一种资源,因为我经常在各种帖子中使用参数注释 回答1 有很多方法可以在查询中使用参数。 我将尝试为其中的大多数示例以及适用的示例提供示例。 首先,我们将讨论Access独有的解决方案,例如表单,报表和域聚合。 然后,我们将讨论DAO和ADO。 使用表单和报表中的值作为参数 在Access中,您可以直接在SQL代码中使用表单和报表上控件的当前值。
  • 如何在VBA中的下一行继续代码(How to continue the code on the next line in VBA)
    问题 我想在VBA代码中键入很多行的数学体式。 我想将其分为多行。 我该怎么做? 例如: U_matrix(i, j, n + 1) = k * b_xyt(xi, yi, tn) / (4 * hx * hy) * U_matrix(i + 1, j + 1, n) + (k * (a_xyt(xi, yi, tn) / hx ^ 2 + d_xyt(xi, yi, tn) / (2 * hx))) 很长想将其拆分。 试过这个: U_matrix(i, j, n + 1) = k * b_xyt(xi, yi, tn) / (4 * hx * hy) * U_matrix(i + 1, j + 1, n) _+ (k * (a_xyt(xi, yi, tn) / hx ^ 2 + d_xyt(xi, yi, tn) / (2 * hx))) 但不起作用。对此需要一些指导。 回答1 要在代码中包含换行符,请使用_ 例子: Dim a As Integer a = 500 _ + 80 _ + 90 MsgBox a 回答2 (i, j, n + 1) = k * b_xyt(xi, yi, tn) / (4 * hx * hy) * U_matrix(i + 1, j + 1, n) + _ (k * (a_xyt(xi, yi, tn) / hx ^ 2 + d_xyt(xi
  • 插入语句中的语法错误-什么是错误?(Syntax error in insert into statement - what's the error?)
    问题 这是用于将数据添加到2个不同表中的按钮的完整代码,很奇怪的是,我有另一种形式的按钮,具有类似的功能,并且在同一语句中也能正常工作选项比较数据库 Private Sub addbutton_Click() CurrentDb.Execute "INSERT INTO Clients(F_Name,L_Name,Phone_Number,E-mail,Gender,Date_of_Birth) " & "VALUES(" & Me.textfname & ",'" & Me.textlname & "','" & Me.textpnumber & "','" & Me.textemail & "','" & Me.textgender & "','-" & Me.textdob & "')" CurrentDb.Execute "INSERT INTO Accounts(F_Name,L_Name,Username,Password,accounttype) " & "VALUES(" & Me.textfname & ",'" & Me.textlname & "','" & Me.textusername & "','" & Me.textpassword & "','" & Me.textaccountype & "')" clientssubform.Form
  • How can I edit/insert Mathtype equation objects with a VBA macro in MS-word?
    I want to insert or edit Mathtype equations with VBA macro in MS-Word. Sometimes We have several equations in a MS-word document and need edit them with a VBA macro. For example: we have to take some changes in overall of our MS-Word document. That changes are separable by document's paragraph styles and we can do format edition for each paragraph style, and same for all Mathtype objects whose their paragraph has that style. We want write a VBA macro to do that. but the problem is in: "How we can edit formatting of Mathtype equation objects with a VBA macro coding in MS-Word document?" Thanks
  • 如何在C#中创建Word文档? [关闭](How can a Word document be created in C#? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 7年前关闭。 改善这个问题 我有一个项目,我想以MS Word格式生成报告导出。 该报告将包括图像/图形,表格和文本。 做这个的最好方式是什么? 第三方工具? 你有什么经验? 回答1 答案将在一定程度上取决于应用程序是在服务器上运行还是在客户端计算机上运行。 如果您在服务器上运行,则将要使用一种基于XML的Office生成格式,因为在服务器上使用Office Automation时会出现一些已知问题。 但是,如果您在客户端计算机上工作,则可以选择使用Office Automation还是使用Office Open XML格式(请参阅下面的链接),Microsoft Office 2000以及其本身或通过Service Pack支持该格式。 不过,这样做的一个缺点是您可能无法嵌入想要显示的某些图形或图像。 处理事情的最佳方法全都取决于您必须花多少时间在开发上。 如果您走Office Automation的路线,那么有很多不错的教程可以通过Google找到,并且非常简单易学。 但是,Open Office XML格式是相当新的,因此您可能会发现学习曲线要​​高一些。 Office Open XML信息 Office Open XML-http:/
  • 如何在Access的查询编辑器中执行多个SQL语句?(How do I execute multiple SQL Statements in Access' Query Editor?)
    问题 我有一个文本文件,其中包含一些要在Access数据库上运行的SQL语句。 我认为使用Access的查询编辑器应该可以实现。 因此,我进入此编辑器并粘贴以下语句: insert into aFewYears (yr) values ('2000') insert into aFewYears (yr) values ('2001') insert into aFewYears (yr) values ('2002') insert into aFewYears (yr) values ('2003') 尝试运行它们(点击红色感叹号),我收到了Missing semicolon (;) at end of SQL statement. 这可以被视为表明编辑器将允许执行多个语句。 因此,我更改了语句并在末尾添加了这样的分号: insert into aFewYears (yr) values ('2000'); insert into aFewYears (yr) values ('2001'); insert into aFewYears (yr) values ('2002'); insert into aFewYears (yr) values ('2003'); 然后我得到一个Characters found after end of SQL statement
  • Dir()函数在Mac Excel 2011 VBA中不起作用(Dir() function not working in Mac Excel 2011 VBA)
    问题 嗨,我正在尝试列出Excel工作簿所在子目录中的所有文件。由于某些原因,代码无法执行Dir功能。 任何人都可以请教吗? 谢谢! Sub ListFiles() ActiveSheet.Name = "temp" Dim MyDir As String 'Declare the variables Dim strPath As String Dim strFile As String Dim r As Long MyDir = ActiveWorkbook.Path 'current path where workbook is strPath = MyDir & ":Current:" 'files within "Current" folder subdir, I am using Mac Excel 2011 'Insert the headers in Columns A, B, and C Cells(1, "A").Value = "FileName" Cells(1, "B").Value = "Size" Cells(1, "C").Value = "Date/Time" 'Find the next available row r = Cells(Rows.Count, "A").End(xlUp).Row + 1 'Get the first file
  • 如何强制VBA / Access要求定义变量?(How do I force VBA/Access to require variables to be defined?)
    问题 我正在对某些VBA代码进行重大更改,并且某些变量已被删除和/或重命名。 如果编译器向我抱怨变量不存在而不是动态创建变量,那么查找需要更新的所有位置会容易得多。 如何强制VBA / Access要求声明变量? 回答1 您需要在每个VBA代码模块(包括表单和报告)的顶部使用Option Explicit 。 您可以进入VBA编辑器>>工具>>选项>>编辑器选项卡,并确保选中了“需要变量声明”,以为表单和报表后面的所有将来创建的模块和VBA代码设置此设置。 从Access 2003帮助: 要求变量声明—确定模块中是否需要显式变量声明。 选择此Option Explicit会将Option Explicit语句添加到任何新模块的常规声明中。 当我将变量变暗时,我也会使用驼峰式大小写。 ThisIsAnExampleOfCamelCase 。 一旦我退出VBA代码行,如果Access不能将小写变量更改为驼峰大小写,那么我知道我有错字。 回答2 有关OPTION EXPLICIT和Access VBA的一些历史记录 根据Tony的回答,这里有一些解释,说明为什么在某些Access代码模块中未存在OPTION EXPLICIT的问题。 在Access 95和Access 97(带有VBA的前两个Office版本)中,Access的代码编辑器与其他Office程序不同。 在Access
  • VBA短路和替代品[重复](VBA Short-Circuit `And` Alternatives [duplicate])
    问题 这个问题已经在这里有了答案: VBA中的AndAlso / OrElse (8个答案) 6年前关闭。 VBA不会短路 VBA不支持短路-显然是因为它仅具有按位“与/或/非”等操作。 根据VBA语言规范:“逻辑运算符是对数据进行按位计算的简单数据运算符。” 因此,将VBA设计为true = &H1111和false = &H0000 true = &H1111 :这样,逻辑语句可以视为按位运算。 缺少短路会导致问题 性能:计算该语句时,即使条件左边的结果没有必要,也始终会运行ReallyExpensiveFunction() If IsNecessary() And ReallyExpensiveFunction() Then '... End If 错误:如果MyObj为Nothing,则此条件语句将导致运行时错误,因为VBA仍将尝试检查Property的值If Not MyObj Is Nothing And MyObj.Property = 5 Then '... End If 我用来实现短行为的解决方案是嵌套If s If cond1 And cond2 Then '... End If 成为 If cond1 Then If cond2 Then '... End If End If 这样,如果cond1为False则If语句会产生类似短路的行为,无需cond2
  • 在VBA中加速嵌套循环宏所需的指针(Pointers needed for speeding up nested loop macro in VBA)
    问题 我需要帮助来加快我直接的8变量嵌套循环宏的速度。 每个循环仍需要约1秒的时间,并且要完成数十万次循环,因此需要3到4天才能完成! 从这里的阅读和实验中,我确实做了尽可能多的精简工作,但现在遇到了麻烦。 我的宏基本上有3个细分。 1)为每个循环上的变量分配值,2)将这些值插入我的excel模型中以执行计算,以及3)每次将每次迭代的结果粘贴到新行中。 我已为每个片段计时,每个片段所需的时间分别为(大约)0.4s,0.4s和0.2s。 我对段1)感到很困惑,因为只需要0.4s就可以为每个循环的变量赋值。 我接受第2段的缓慢是因为我的excel电子表格的大小约为5,000行(可能是我的excel编程不好),而第3段)的结构已经进行了重组(感谢您在此论坛上的支持!)和比以前快很多。 这是代码: Sub VariableIteration2() Dim a As Double Dim b As Double Dim c As Double Dim d As Double Dim w As Double Dim x As Double Dim y As Double Dim z As Double Dim Row As Long Dim Results As Variant Dim T1S As Double Dim T1E As Double Dim T2S As Double Dim
  • Use date in Excel cell in BETWEEN clause in SQL query
    (1) Table DB-Fiddle CREATE TABLE logistics ( id int primary key, Product VARCHAR(255), insert_timestamp Date ); INSERT INTO logistics (id, product, insert_timestamp ) VALUES ("1", "Product_A", "2020-02-24 18:15:48"), ("2", "Product_B", "2020-02-24 20:30:17"), ("3", "Product_C", "2020-02-24 23:54:58"), ("4", "Product_D", "2020-02-25 08:09:30"), ("5", "Product_E", "2020-02-25 10:17:15"); (2) VBA Value in Cell B1 = 2020-02-24 Sub Get_Data() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim dateVar As Date Set conn = New ADODB.Connection conn.ConnectionString = "DRIVER={MySQL ODBC
  • 在VBA(Excel)中循环浏览行的最有效/最快捷的方法是什么?(What is the most efficient/quickest way to loop through rows in VBA (excel)?)
    问题 我知道Excel中的VBA并不是最快的方法-但是我需要最有效(即最快)的方法来遍历大量行样本。 目前我有: For Each c In Range("$A$2:$A$" & Cells(Rows.count, "A").End(xlUp).row ' do stuff Next c “要做的事情”包括在此插入一行(因此,我需要保持范围的动态查找。) 有什么主意(超过10,000行)? 编辑我已经在使用 Application.ScreenUpdating = False Application.Calculation = xlManual 回答1 如果只循环A列中的1万行,则将其转储到变量数组中,然后循环遍历。 然后,您可以将元素添加到新数组中(同时在需要时添加行),并使用Transpose()一步将数组放到您的范围内,也可以使用迭代器变量来跟踪您所在的行并添加这样行。 Dim i As Long Dim varray As Variant varray = Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value For i = 1 To UBound(varray, 1) ' do stuff to varray(i, 1) Next 这是在评估每个单元格后如何添加行的示例。 本示例仅在A列中每个包含单词“
  • 【转载】Hint的常见错误使用方式
    Hint的常见错误使用方式 提起Oracle数据库的Hint,几乎每一个DBA都知道这一强大工具。在Oracle中,Hint可以用来改变SQL的执行计划、固定SQL的执行计划。Oracle数据库内部的很多特性也依赖于Hint,比如Outline、Profile等。但是在日常工作中,很多开发人员或DBA,对Hint的使用仍然存在一些错误的方式。下面将列举主要的2种。(本文不讨论Hint的滥用即过度使用问题)。1. NOLOGGING的不正确使用。很多人知道,在进行数据处理时,如果不产生日志或只产生少量的日志,将会有明显的、甚至是巨大的效率提升。下面有几条不同的SQL:view plain copy to clipboard print ? INSERT INTO T1 NOLOGGING; INSERT INTO T1 SELECT * FROM T2 NOLOGGING; INSERT /*+ NOLOGGING */ INTO T1 VALUES ('0'); INSERT /*+ NOLOGGING */ INTO T1 SELECT * FROM T2; DELETE /*+ NOLOGGING */ FROM T1; UPDATE /*+ NOLOGGING */ T1 SET A='1'; 实际上,上述所有的SQL没有一个能够实现“不产生”日志的数据更改操作。第1
  • 【转载】Hint的常见错误使用方式
    Hint的常见错误使用方式 提起Oracle数据库的Hint,几乎每一个DBA都知道这一强大工具。在Oracle中,Hint可以用来改变SQL的执行计划、固定SQL的执行计划。Oracle数据库内部的很多特性也依赖于Hint,比如Outline、Profile等。但是在日常工作中,很多开发人员或DBA,对Hint的使用仍然存在一些错误的方式。下面将列举主要的2种。(本文不讨论Hint的滥用即过度使用问题)。1. NOLOGGING的不正确使用。很多人知道,在进行数据处理时,如果不产生日志或只产生少量的日志,将会有明显的、甚至是巨大的效率提升。下面有几条不同的SQL:view plain copy to clipboard print ? INSERT INTO T1 NOLOGGING; INSERT INTO T1 SELECT * FROM T2 NOLOGGING; INSERT /*+ NOLOGGING */ INTO T1 VALUES ('0'); INSERT /*+ NOLOGGING */ INTO T1 SELECT * FROM T2; DELETE /*+ NOLOGGING */ FROM T1; UPDATE /*+ NOLOGGING */ T1 SET A='1'; 实际上,上述所有的SQL没有一个能够实现“不产生”日志的数据更改操作。第1