我想复制一行而不是键,当然没有明确使用字段名称
有SQL方法还是我必须通过代码枚举字段名称?
我不想明确使用字段名称,因为我想最小化代码和数据库依赖项。
我将在Ms Access 2003中使用它。如果不存在标准方法,我会提及它。
答案 0 :(得分:5)
INSERT INTO `<table>` (column1, column2, ...) -- Not IDENTITY columns
SELECT column1, column2, ... FROM ...
这也允许您插入主键列的替换值等。我已经使用它和一个公用表表达式来获取2月份的一组测试数据,并假装它们真的是六月份。
我知道你说你想在没有字段名称的情况下这样做,但我认为你不能。这也不是一个好主意,因为它会将你与列的顺序联系起来。
答案 1 :(得分:3)
如果你没有任何独特的担忧:
INSERT INTO <table> (SELECT * FROM <table> WHERE <condition>)
否则,John Saunders' answer可能是您最好的选择。
答案 2 :(得分:0)
如果您的主键字段具有自动标识符,那么您可能能够编写脚本以使系统与不在PK中的字段进行交互,并将现有值用于那些不存在且仅插入那些字段的字段(或者为PK字段插入null
)。
因此,我认为不存在“标准”方式。
答案 3 :(得分:0)
我不是Access用户,但在SQL Server中,您可以在SQL Server Management Studio中选择“脚本表为 - &gt;插入到”。您可以轻松地修改它以将所需的行过滤到INSERT INTO SELECT语句中。
Access中可能存在类似的内容吗?
答案 4 :(得分:0)
就像大家在我之前所说的那样,你可以“插入TBL SELECT *从TBL WHERE X = Y”,你会得到一行。如果您有主键,这将失败。
如果你没有PK,那么你可能会遇到更大的问题。
这是链接表吗?如果是这样,则没有数据库依赖项,因为您正在处理ODBC链接。在这种情况下,您可以轻松地使用它来获取表的列列表:
SELECT TOP 0 * FROM TBL(在链接的tbl上需要往返服务器)
你得到一个空记录集,你只需遍历列。
答案 5 :(得分:0)
Ms Access 2003 面向解决方案
我有一个表单,用户可以按下按钮创建当前记录的新版本 Ms Access中的那部分很简单:
DoCmd.GoToRecord , , acNewRec
现在我需要更新表单上的所有字段(控件与表字段绑定),除了键,即“id”字段,以及来自其他记录的数据。
我提出了以下例程,这对我有用:
Private Sub UpdateRow(tblname As String, key_name As String, key_value As String)
Dim Rst As Recordset
Dim field As field
Set DB = CurrentDb
Set Rst = DB.OpenRecordset("select * from " & tblname & " where " & _
key_name & "=" & key_value, dbOpenDynaset)
For Each field In Rst.Fields
If field.Name <> key_name Then
Form(field.Name) = field
End If
Next field
Rst.Close
Set Rst = Nothing
Set DB = Nothing
End Sub
我这样用它:
DoCmd.GoToRecord , , acNewRec
UpdateRow "TableName", "KeyName", "some_previous_key_value"
Form.Refresh
答案 6 :(得分:0)
当您提供替换值时,您需要明确提供键的字段名称,因此根本不可能采用“标准”方式。
...除非所有表都有一个密钥,所有表都具有相同的名称(ID很受欢迎),并且每个密钥都包含一个具有IDENTITY(autonumber)属性的列,在这种情况下,您实际上就是根本没有密钥,只是一种使用IDENTITY值来唯一标识重复行的方法!