sql-server - 使用 VBA 仅将新记录插入到 SQL 表中

标签 sql-server excel ssms vba

我有一个包含以下代码的 Excel 工作簿 -

Sub Button1_Click()
    Dim conn As New ADODB.Connection
    Dim iRowNo As Integer
    Dim sFirstName, sLastName As String

    With Sheets("Sheet1")

        'Open a connection to SQL Server
        conn.Open "Provider=SQLOLEDB;" & _
            "Data Source=server1;" & _
            "Initial Catalog=table1;" & _
            "User ID=user1; Password=pass1"

        'Skip the header row
        iRowNo = 2

        'Loop until empty cell in CustomerId
        Do Until .Cells(iRowNo, 1) = ""
            sFirstName = .Cells(iRowNo, 1)
            sLastName = .Cells(iRowNo, 2)

            'Generate and execute sql statement
            ' to import the excel rows to SQL Server table
            conn.Execute "Insert into dbo.Customers (FirstName, LastName) " & _
                         "values ('" & sFirstName & "', '" & sLastName & "')"

            iRowNo = iRowNo + 1
        Loop

        MsgBox "Customers imported."

        conn.Close
        Set conn = Nothing

    End With

End Sub

这将打开与我的数据库的连接并输入指定列中的值。

主键是数据库上的增量键。问题是它将复制所有值。

我想将新的数据行添加到 Excel 工作表中,并且只插入那些尚不存在的行。

我尝试了不同的方法(“合并”、“如果存在”、“如果不存在”等),但我无法做到正确。

解决方案必须通过VBA。使用 SSMS 设置链接不是一个选项。

我知道可以使用临时表,然后触发执行合并的过程,但我想将其作为最后的手段。还没有读过它(通过我的 MS SQL 圣经书),但我希望没有必要。

---@Kannan 的回答更新---

VBA 的新部分 -

conn.Execute "IF EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" &      sFirstName & "' and LastName = '" & sLastName & "') " & _
             "THEN UPDATE dbo.customers SET WHERE Firstname = '" & sFirstName & "' and LastName = '" & sLastName & "' " & _
             "ELSE INSERT INTO dbo.Customers (FirstName, LastName) " & _
             "VALUES ('" & sFirstName & "', '" & sLastName & "')"

这会返回错误“关键字“THEN”附近的语法不正确。

最佳答案

您的 SQL 查询不太正确 - SQL IF 中没有 THEN

此外,如果它存在,您不需要执行任何操作,因此只需使用如果不存在即可。

"IF NOT EXISTS (SELECT 1 FROM dbo.Customers WHERE FirstName = '" & sFirstName & "' and LastName = '" & sLastName & "') " & _
         "INSERT INTO dbo.Customers (FirstName, LastName) " & _
         "VALUES ('" & sFirstName & "', '" & sLastName & "')"

关于sql-server - 使用 VBA 仅将新记录插入到 SQL 表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293669/

相关文章:

SQL 根据另一列的输入值列表列出一列的通用值?

sql-server - 在 Ubuntu 上通过 TSQL 连接到 MSSQL 时遇到问题

sql - Excel 2010 中的 PowerView

java - 使用java poi在excel中过滤列

sql - 如何过滤表以仅检索每条记录的一次出现

mysql - 尝试使用 ODBC 在 Windows 中从 qt 写入 MS Sql 数据库时查询执行失败

sql - 如何包含行号但显示平局?

excel - 如何在Excel中无法以图形方式显示的外部数据查询中添加参数?

sql-server - 如何安装 SQL Server Management Studio 2012 (SSMS) Express?

sql - 将 varchar 值转换为 smallint 数据类型时转换失败