2016-04-28 37 views
5

Mam tabelę dbo w SQL z kolumną, którą muszę podzielić na wiele kolumn na podstawie ogranicznika (,). Kod do wypełnienia tego znajduje się na końcu tego pytania. Kod działa doskonale jako zapytanie, jednak chciałbym zaimportować ostateczną tabelę (tak po podzieleniu) w MS Access 2010. To wszystko poszło nie tak, ponieważ nie mogę znaleźć tabeli z ODBC lub plikiem zapytania. Ponadto, z powodu funkcji "Zadeklaruj", nie mogę umieścić tego kodu w funkcji widoku. Kod pochodzi z (pokazuje również, co chcę zrobić z moim kodem): https://raresql.com/2015/08/22/sql-server-how-to-split-one-column-into-multiple-columns/Zapytanie SQL nie może zostać zaimportowane do MS Access 2010

Czy możesz mi w tym pomóc?

Aby podzielić się 1 kolumnę w wielu kolumnach poniżej kod jest używany:

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 

góry dziękuję

+2

Dlaczego nie można wykluczyć zadeklarować i użyć Wymienić ([Brama], „”, «») . Nie masz zmiennych i możesz utworzyć widok. – PSVSupporter

Odpowiedz

1

można umieścić swój kod do procedury przechowywanej. Następnie wywołać ją z Access i umieścić go w tabeli za pomocą rekordów:

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 
+0

To działa idealnie. Jednak użyłem poniższego kodu do odczytu w dostępie: Utwórz nową kwerendę w programie Access, nie dodawaj żadnych tabel. Kliknij Query ~ SQL Specific ~ Pass-Through. W oknie SQL wpisz swoją instrukcję, np. EXEC usp_MyProcedure '6/6/2008' , a następnie kliknij Wyświetl ~ Właściwości i pod łańcuchem ODBC Connect kliknij przycisk budowania (...) i wybierz DSN, który wskazuje na twoją bazę danych SQL. Dzięki chłopaki – TruckTruck

2

rozważyć dwa specjalne przedmioty query (oba dostępne na taśmie) w MS Access:

  1. tranzytowej zapytania, który pozwala aby zachować składnię SQL Server połączonego BackEnd, ale uruchomić z poziomu MS Access; będzie to wymagało określenia ustawień ODBC/OLEDB podczas tworzenia.
  2. Kwerenda działania Utwórz tabelę, aby wygenerować tabelę lokalnego dostępu z powyższego testu za pomocą zapytania .

Pass-Through Zapytanie

(zapisz jako przechowywanej, pass-through przedmiotu zapytania, nieznacznie poprawił CTE do tabeli pochodzącej ale nie ma powodu, CTE nie może pracować)

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 

Make-Table Zapytanie

(Zapytanie działania mogą być prowadzone raz lub zapisane jako zapisanego obiektu zapytania do regularnego stosowania)

SELECT * 
INTO [NewMSAccessLocalTable] 
FROM [SQLServerPassThruQuery] 
Powiązane problemy