2016-04-28 10 views
5

デリミタ(、)に基づいて複数の列に分割する必要があるSQLでdboテーブルをSQLに作成しました。これを達成するためのコードは、この質問の最後です。コードは完全にクエリとして機能しますが、MS Access 2010で最終的なテーブルをインポートしたいのですが(分割後)、ODBCやクエリファイルでテーブルを見つけることができないので、間違っていました。また、 "Declare"関数のため、このコードをビュー関数に入れることはできません。コードは次のとおりです(私のコードで何をしたいのかを示しています): https://raresql.com/2015/08/22/sql-server-how-to-split-one-column-into-multiple-columns/MS Access 2010でSQLクエリをインポートすることができません

私にこれを手伝ってもらえますか?

以下のコードが使用されている複数の列に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 

あなたは、ストアドプロシージャにコードを置くことができ、事前

+2

あなたが宣言を除外し、 ([GATE]、「」、 『』)を交換してくださいを使用していないのはなぜ(アクションクエリが1時間を実行したり、定期的に使用するために保存されたクエリオブジェクトとして保存することができます) 。変数はなく、ビューを作成できます。 – PSVSupporter

答えて

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

これは完全に機能します。しかし、私はアクセスの読み取りのために以下のコードを使用しました: 新しいクエリをAccessで作成し、テーブルを追加しないでください。 Query〜SQL固有〜パススルーをクリックします。 SQLウィンドウに文を入力します。 EXEC usp_MyProcedure '6/6/2008' をクリックしてView〜Propertiesをクリックし、ODBC Connect Stringの下にあるビルドボタン(...)をクリックし、SQLデータベースを指すDSNを選択します。 ありがとうございます – TruckTruck

2

は、MS Accessで(リボン上の利用可能の両方)は、2つの特別なクエリオブジェクトを考えてみますができます

  1. パススルークエリ接続されたBackEndのSQL Server の構文を保持するが、MS Accessの内部から実行する。作成時にODBC/OLEDB設定を指定する必要があります。
  2. クエリを介して上記のパス からローカルAccessテーブルを生成するMake-Tableアクションクエリ。

パススルークエリ

(わずかに派生テーブルに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] 
関連する問題