簡體   English   中英

無法在MS Access 2010中導入SQL查詢

[英]SQL query cannot be imported in MS Access 2010

我在SQL中有一個dbo表,我需要根據分隔符(,)將列拆分為多個列。 實現這一目標的代碼就在這個問題的最后。 代碼完美地作為查詢,但我想在MS Access 2010中導入最終表(因此在拆分后)。這是錯誤的,因為我找不到ODBC或查詢文件的表。 另外,由於“聲明”功能,我無法將此代碼放在視圖函數中。 代碼來自(它還顯示我想用我的代碼做什么): https//raresql.com/2015/08/22/sql-server-how-to-split-one-column-into-multiple-列/

你能幫幫我嗎?

要將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

先感謝您

考慮MS Access中的兩個特殊查詢對象(在Ribbon上都可用):

  1. Pass-Through查詢,允許您保留連接的BackEnd的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]

您可以將代碼放入存儲過程中。 然后從Access調用它並在recordset的幫助下將其放入表中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM