我是访问sql的新手,我在使用tryint格式化从一个表到另一个表的插入数据时遇到了问题。
我有一个看起来像这样的表,其中带有“2017”的值对应于它们周围的代码,如
code
values
* code
因为这是一个非常古老的系统的输出。
+--------------+------------+----------+------+
| Code | Date | Time | Qt |
+--------------+------------+----------+------+
| D4D5F44G8 | | | |
| 2017 | 15.08.2017 | 22:30:44 | 792 |
| 2017 | 15.08.2017 | 11:17:03 | 48 |
| 2017 | 15.08.2017 | 04:50:52 | 288 |
| * D4D5F44G8 | | | |
| F45D7W8E9F | | | |
| 2017 | 15.08.2017 | 04:50:54 | 792 |
| * F45D7W8E9F | | | |
+--------------+------------+----------+------+
我正在尝试插入另一个表值,这些值将代码作为代码的唯一值:
+--------------+------------+----------+------+
| Code | Date | Time | Qt |
+--------------+------------+----------+------+
| D4D5F44G8 | 15.08.2017 | 22:30:44 | 792 |
| D4D5F44G8 | 15.08.2017 | 11:17:03 | 48 |
| D4D5F44G8 | 15.08.2017 | 04:50:52 | 288 |
| F45D7W8E9F | 15.08.2017 | 04:50:54 | 792 |
+--------------+------------+----------+------+
但我找不到像交叉应用或在普通sql中几乎相同的值之间获取行,更不用说Access sql了。
这可以通过使用Access SQL实现,还是应该通过一系列功能尝试使用VBA Access?甚至在SQL Server中执行此操作的帮助也会有所帮助,但最好在Access中执行此操作。
任何类型的建议都可以提供帮助,我已经坚持了很长一段时间。
再一次,英语不是我的第一语言,所以感谢您对语法的耐心。 提前谢谢。
答案 0 :(得分:1)
我发现你已经解决了这个问题,你的方法是最好的解决方案。
但是,您最初要求可能的SQL Server解决方案。通过将数据更改为XML并使用SQL XML功能,您可以在没有游标的情况下执行此操作。像这样:
DECLARE @xmlData as XML
SELECT @xmlData = cast(replace(replace(
(SELECT
(SELECT ('' + fx.[XMLString])
FROM (SELECT
case when [Date] is null
then
case when substring([Code],1,1) = '*'
then
'</CodeTag>'
else
'<CodeTag><Code>' + [Code] + '</Code>'
end
else
'<SubCode><Year>' + [Code] + '</Year><Date>' + [Date] + '</Date>
<Time>' + [Time] + '</Time><Qt>' + [Qt] + '</Qt></SubCode>'
end as [XMLString]
FROM
#tblYourTableHere) as fx
FOR XML PATH('')) as [txtString])
, '>', '>'), '<', '<') as xml)
您还可以在导入数据时将导入的数据格式化为XML,从而避免使用上述代码。但是如果你已经把它放在一个表中,你可以运行上面的代码。
然后,您可以通过此查询运行该XML代码以获取节点:
SELECT
cast(ct.xcode.query('data(Code)') as VarChar(max)) AS [Code]
,cast(st.xcode.query('data(Year)') as VarChar(max)) AS [Year]
,cast(st.xcode.query('data(Date)') as VarChar(max)) AS [Date]
,cast(st.xcode.query('data(Time)') as VarChar(max)) AS [Time]
,cast(st.xcode.query('data(Qt)') as VarChar(max)) AS [Qt]
FROM @xmlData.nodes('/CodeTag') ct(xcode)
CROSS APPLY
ct.xcode.nodes('./SubCode') AS st(xcode);
不太困难,它使用本机SQL结构。
答案 1 :(得分:0)
最后我通过在ms-access中使用vba来解决它,它比我想象的要容易得多,我忘记了访问后面有一整套语言我可以访问。 bad dum tss
这就是我使用的:
Function Format_LS()
On Error Resume Next
Dim rs As DAO.Recordset
Dim db As Database
Dim strSQL As String
Dim This_Code As String
Dim SQL As String
Set db = CurrentDb
strSQL = "select * from US_Old where Code not alike '%*%'"
Set rs = db.OpenRecordset(strSQL)
This_Code = ""
Do While Not rs.EOF
If rs("Code").Value <> Trim(Year(Date)) Then
This_Code = rs("Code").Value
Else
SQL = "INSERT INTO US (Code, Date, Time, Qt) VALUES ('" + This_Code + "','" + rs("Date").Value + "','" + rs("Time").Value + "','" + rs("Qt").Value + "')"
DoCmd.RunSQL SQL
End If
rs.MoveNext
End Function
它需要清洁,但它完成了工作。感谢所有试图帮助的人,并向我指出了有用的东西。