【发布时间】:2016-10-22 06:04:57
【问题描述】:
我有一个包含两个模式的数据库,这些模式由同一组表组成。我正在使用 VBA 中的连接字符串连接到数据库,并使用 VBA 创建插入脚本。但是,由于有两个模式具有相同的表,因此我的代码将为两个模式中的每个表返回插入脚本。我需要知道如何指定要使用的架构。下面是我正在使用的代码..
Sub GenerateStandardBusinessRule_UpdateSQL()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim rsSys As Recordset
Dim ServName As String
Dim dbName As String
Dim dbType As String
Dim TableName As String
Dim InstName As String
Dim wrk As String
Dim sUpdStart As String
Dim sUpdEnd As String
Dim i
Dim sSQL As String
Dim sUser As String
Dim sPW As String
Dim sField As String
Dim n As Integer
'Instantiate variables
ServName = Workbooks("BusinessRules_UpdatesBuilder.xlsm").Sheets("BuildStatement").Range("A2").Value
dbName = Workbooks("BusinessRules_UpdatesBuilder.xlsm").Sheets("BuildStatement").Range("B2").Value
InstName = Workbooks("BusinessRules_UpdatesBuilder.xlsm").Sheets("BuildStatement").Range("C2").Value
TableName = Workbooks("BusinessRules_UpdatesBuilder.xlsm").Sheets("BuildStatement").Range("D2").Value
dbType = Workbooks("BusinessRules_UpdatesBuilder.xlsm").Sheets("BuildStatement").Range("E2").Value
wrk = "UPDATE " & InstName & "." & TableName & vbCrLf & "SET" & Chr(10)
If dbType = "Varchar" Then
sUpdStart = "= NULLIF(LTRIM(RTRIM(": sUpdEnd = ")),'')"
Else
sUpdStart = "=CAST(": sUpdEnd = " as date)"
End If
'Get Data type info
sSQL = "SELECT Column_Name " & _
"FROM Information_Schema.Columns " & _
"WHERE Table_Name = " & Chr(39) & TableName & Chr(39) & " " & _
"AND Data_Type = " & Chr(39) & dbType & Chr(39) & ""
'Set db Connection and open Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;Data Source=" & ServName & " ; Initial Catalog=" & dbName & "; User ID=ETLUser; Password=xxxxxxxx;"
Set rs = New ADODB.Recordset
rs.Open sSQL, cn, adOpenKeyset, adLockOptimistic
'Loop through recordset and contruct SQL Update statement
If Not rs.BOF Then
rs.MoveLast
i = rs.RecordCount
n = 1
rs.MoveFirst
Do Until rs.EOF
sField = rs("Column_Name")
If n < i Then
wrk = wrk & vbTab & sField & sUpdStart & sField & sUpdEnd & "," & Chr(10)
Else
wrk = wrk & vbTab & sField & sUpdStart & sField & sUpdEnd
End If
rs.MoveNext
n = n + 1
Loop
End If
'Update Excel Spreadsheet
Workbooks("BusinessRules_UpdatesBuilder.xlsm").Sheets("BuildStatement").Range("F3").Value = wrk
结束子
【问题讨论】:
-
不就是
DB.SCHEMA之类的吗? -
正如下面发布的答案中提到的:您正在连接到服务器并且不是服务器上的架构或数据库。您可以在连接字符串中指定默认数据库,以覆盖在 SQL 服务器上为用户指定的任何内容。但即使这样也可以在查询中被覆盖(非常类似于模式)。在更新 VBA 之前,您应该学习和阅读有关 SQL 的知识。之后,您将得出结论,您必须更新此行:
wrk = "UPDATE " & InstName & "." & TableName & vbCrLf & "SET" & Chr(10),以便获得UPDATE DataBaseName.SchemaName.TableName。
标签: sql excel vba connection-string