2016-04-28 77 views
5

我在SQL中有一个dbo表,我需要根据分隔符(,)将其拆分为多个列。完成这个的代码在这个问题的最后。代码完美地作为一个查询,但是我想在MS Access 2010中导入最终的表格(所以在拆分之后)。这是错误的,因为我无法用ODBC或查询文件找到表格。此外,由于“声明”功能,我不能把这段代码放在视图函数中。代码是从(它也显示了我想要用我的代码): 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

你为什么不排除声明和使用 替换([门],“”,‘’) 。你没有变数,可以查看。 – 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 Specific〜Pass-Through。在SQL窗口中,输入您的语句,例如 EXEC usp_MyProcedure'6/6/2008' 然后单击查看〜属性,然后在ODBC连接字符串下单击生成按钮(...)并选择一个指向您的SQL数据库的DSN。 谢谢你们 – TruckTruck

2

在MS Access考虑两个特殊查询的对象(无论在功能区提供):

  1. 传递查询,让您保留连接的后端的SQL Server 语法,但从MS Access中运行;这将需要在创建时指定ODBC/OLEDB设置。
  2. 生成表操作查询从上面生成本地Access表通过 通过查询。

直通查询

(保存为一个存储,传递查询对象,微热膨胀系数调整为派生表,但没有理由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]