【问题标题】:SQL query cannot be imported in MS Access 2010MS Access 2010 中无法导入 SQL 查询
【发布时间】:2016-08-23 04:55:28
【问题描述】:

我在 SQL 中有一个 dbo 表,其中有一列我需要根据分隔符 (,) 将其拆分为多个列。实现这一点的代码在这个问题的末尾。该代码可以完美地用作查询,但是我想在 MS Access 2010 中导入最终表(因此在拆分之后)。那是它出错了,因为我找不到带有 ODBC 或查询文件的表。此外,由于“声明”功能,我无法将此代码放在视图函数中。代码来自(它还显示了我想用我的代码做什么): https://raresql.com/2015/08/22/sql-server-how-to-split-one-column-into-multiple-columns/

你能帮我解决这个问题吗?

要将 1 列拆分为多列,请使用以下代码:

DECLARE @delimiter VARCHAR(50)
SET @delimiter=', '

;WITH CTE AS
( 
    SELECT  [Tour number], 
            [TISLOT Time slot begin],
            [TISLOT Delivery day],
            [Gate],
            CAST('<M>' + REPLACE([Gate], @delimiter , '</M><M>') + '</M>' AS XML) AS [Gate XML]
    FROM dbo.TISLOT
)

SELECT  [Tour number], 
        [TISLOT Time slot begin],
        [TISLOT Delivery day],
        [Gate],
        [Gate XML].value('/M[1]', 'varchar(50)') As [Gate1],
        [Gate XML].value('/M[2]', 'varchar(50)') As [Gate2],
        [Gate XML].value('/M[3]', 'varchar(50)') As [Gate3],
        [Gate XML].value('/M[4]', 'varchar(50)') As [Gate4],
        [Gate XML].value('/M[5]', 'varchar(50)') As [Gate5],
        [Gate XML].value('/M[6]', 'varchar(50)') As [Gate6],
        [Gate XML].value('/M[7]', 'varchar(50)') As [Gate7],
        [Gate XML].value('/M[8]', 'varchar(50)') As [Gate8],
        [Gate XML].value('/M[9]', 'varchar(50)') As [Gate9],
        [Gate XML].value('/M[10]', 'varchar(50)') As [Gate10]
FROM CTE 
GO

提前谢谢你

【问题讨论】:

  • 为什么不排除声明并使用 Replace([Gate], ', ', '')。您没有变量,可以创建视图。

标签: sql sql-server ms-access split


【解决方案1】:

您可以将代码放入存储过程。然后在 Access 中调用它,并借助记录集将其放入表中:

Dim db As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim rstCurr As DAO.Recordset
Dim dbsCurr As Database

db.Open "Provider=SQLNCLI11;Server=SERVER\INSTANCE;Database=MyDataBase;Trusted_Connection=yes;"
db.CommandTimeout = 180
db.CursorLocation = adUseClient

Set rs = db.Execute("EXEC dbo.StoredProc")

Set dbsCurr = Access.CurrentDb
Set rstCurr = dbsCurr.OpenRecordset("AccessTable", dbOpenDynaset)

Do Until rs.EOF

    rstCurr.AddNew
    rstCurr.Fields(0).value = rs.Fields(0).value
    rstCurr.Fields(1).value = rs.Fields(1).value
    ...

    rstCurr.Update
    rs.MoveNext
Loop

Set rs = Nothing
db.Close: Set db = Nothing

【讨论】:

  • 这非常有效。但是我使用下面的代码来读取访问权限:在 Access 中创建一个新查询,不要添加任何表。单击查询 ~ SQL 特定 ~ 传递。在 SQL 窗口中,键入您的语句,例如执行 usp_MyProcedure '6/6/2008' 然后单击查看 ~ 属性并在 ODBC 连接字符串下单击构建按钮 (...) 并选择指向您的 SQL 数据库的 DSN。谢谢大家
【解决方案2】:

考虑 MS Access 中的两个特殊查询对象(都在功能区上可用):

  1. 允许您保留 SQL Server 的传递查询 已连接后端的语法,但从 MS Access 内部运行;这需要在创建时指定 ODBC/OLEDB 设置。
  2. Make-Table 操作查询以从上述过程生成本地 Access 表 通过查询。

直通查询

(另存为存储的直通查询对象,将 CTE 稍微调整为派生表,但没有原因 CTE 无法工作)

SELECT  [Tour number], 
        [TISLOT Time slot begin],
        [TISLOT Delivery day],
        [Gate],
        [Gate XML].value('/M[1]', 'varchar(50)') As [Gate1],
        [Gate XML].value('/M[2]', 'varchar(50)') As [Gate2],
        [Gate XML].value('/M[3]', 'varchar(50)') As [Gate3],
        [Gate XML].value('/M[4]', 'varchar(50)') As [Gate4],
        [Gate XML].value('/M[5]', 'varchar(50)') As [Gate5],
        [Gate XML].value('/M[6]', 'varchar(50)') As [Gate6],
        [Gate XML].value('/M[7]', 'varchar(50)') As [Gate7],
        [Gate XML].value('/M[8]', 'varchar(50)') As [Gate8],
        [Gate XML].value('/M[9]', 'varchar(50)') As [Gate9],
        [Gate XML].value('/M[10]', 'varchar(50)') As [Gate10]
FROM 
   ( 
    SELECT  [Tour number], 
            [TISLOT Time slot begin],
            [TISLOT Delivery day],
            [Gate],
            CAST('<M>' + REPLACE([Gate], ',' , '</M><M>') + '</M>' AS XML) AS [Gate XML]
    FROM dbo.TISLOT 
   ) AS dT

制作表查询

(动作查询可以运行一次或保存为存储的查询对象以供常规使用)

SELECT * 
INTO [NewMSAccessLocalTable]
FROM [SQLServerPassThruQuery]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多