SharePoint 2013/2010 在一个列表或文档库内移动列表项,文档和文件夹位置而保持last modify by 等系统字段保持不变

本文介绍了一款用于SharePoint2013/2010的工具,该工具可在列表或文档库内部移动列表项、文档及文件夹,同时确保系统字段如最后修改者等信息保持不变。

本文讲述SharePoint 2013/2010 在一个列表或文档库内移动列表项,文档和文件夹位置而保持last modify by 等系统字段保持不变的解决方案。

最近遇到客户一个需求,在一个列表或文档库内移动列表项,文档和文件夹位置而保持last modify by 等系统字段保持不变。

研究出来了,不敢独享,特此共享出来给同鞋们做参考:

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MoveSPListItemTool
{
    class Program
    {
        static void Main(string[] args)
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite site = new SPSite("http://SP2013/"))
                {                    
                    site.AllowUnsafeUpdates = true;
                    using (SPWeb web = site.OpenWeb())
                    {
                        SPList list = web.Lists["Documents"];
                        var itemNeedToMove = list.GetItemById(7);
                        MoveItemTo(itemNeedToMove, "TestDocumentSet");                  
                    }
                }
            });

            Console.WriteLine("Done!");
            Console.ReadKey();
        }

        // Path 参数实例: Folder1,  Folder1/Folder2
        public static void MoveItemTo(SPListItem item, string path)
        {   
            switch (item.FileSystemObjectType)
            {
                case SPFileSystemObjectType.Folder:
                    var newFolder = string.Format("{0}/{1}/{2}", item.ParentList.RootFolder.Url, path, item.Folder.Name);
                    item.Folder.MoveTo(newFolder);
                    break;
                case SPFileSystemObjectType.File:
                    if (item.File == null)
                    {
                        var file = item.Web.GetFile(item.Url);
                        var newFilePath = string.Format("{0}/{1}/{2}_.000", item.ParentList.RootFolder.Url, path, item.ID);
                        file.MoveTo(newFilePath);
                    }
                    else
                    {
                        var file = item.Web.GetFile(item.Url);
                        var newFilePath = string.Format("{0}/{1}/{2}", item.ParentList.RootFolder.Url, path, item.File.Name);
                        file.MoveTo(newFilePath);
                    }

                    break;
            }
        }
    }
}


 

<think>好的,我现在需要解决用户关于SQL中ALTER TABLE语句中MODIFYADD被错误使用的问题。首先,用户提到有人将MODIFY用于修改字段类型长度,而ADD用于添加新字段的说法被判定为错误,但用户认为这是正确的。我需要找出为什么这种说法会被认为是错误的,并解释两者的正确区别用法。 首先,我应该回顾SQL中ALTER TABLE的基本用法。根据用户提供的引用[2],ALTER TABLE命令有四个主要子句:ADD、DROP、CHANGEMODIFY。每个子句的作用不同。根据引用[2],MODIFY确实用于修改现有列的类型约束,而ADD用于添加新列。所以,用户提到的说法似乎正确。那为什么会被判定为错误呢? 可能的误解点在于不同数据库系统的实现差异。比如,OracleMySQL在ALTER TABLE语法上可能有所不同。例如,在MySQL中,MODIFY只能修改列类型约束,而CHANGE用于重命名列。而Oracle中可能使用不同的语法,比如ALTER TABLE ... MODIFY用于修改列,而ADD则是添加列。但用户提供的引用[2]中的例子显示,在MySQL中MODIFYCHANGE有不同的用途。因此,可能用户的问题涉及到某个具体数据库系统的语法,而回答者可能混淆了不同系统的语法规则。 另外,用户提供的引用[1]中的例子是Oracle的语法,使用了MODIFY来改变列的长度。而引用[2]中的例子是MySQL的,说明MODIFYCHANGE的不同。因此,可能问题出在用户他人可能没有正确区分不同数据库系统之间的语法差异。例如,在SQL标准中,ALTER TABLE的具体子句可能因数据库而异,导致说法是否正确取决于具体的数据库系统。 因此,正确的回答应该指出,虽然在MySQL中使用MODIFY修改列类型约束是正确的,但在其他数据库如Oracle中,可能同样适用,但某些情况下可能会有不同的语法要求。因此,笼统地说MODIFY用于修改字段类型长度而ADD用于添加新字段是否正确,可能需要结合具体的数据库系统来判断。如果问题中的说法被判定为错误,可能是因为在某个特定上下文中(比如某个数据库系统某个语法规则中)存在例外,者提问者可能误解了MODIFYCHANGE的功能。 此外,需要明确ADD用于添加新列是正确的,而MODIFY用于修改现有列的类型约束也是正确的。但可能错误的原因在于,在某些情况下,比如需要同时修改列名类型时,不能使用MODIFY,而必须使用CHANGE(在MySQL中)。因此,若有人说MODIFY可以修改列名,那会导致错误,但原说法并没有提到修改列名,所以可能还有其他原因。 再仔细看用户的问题,引用[2]提到“modify只能修改字段类型约束,不能重命名字段”,而“change不能修改字段类型约束,只能用来字段重命名”,这可能与实际不符,因为根据MySQL文档,CHANGE既可以重命名列,也可以修改其类型。例如,ALTER TABLE t CHANGE old_name new_name ... 可以同时改名修改类型。因此,引用[2]中的描述可能不完全准确,从而导致混淆。如果用户的问题基于引用[2]中的错误信息,那么原说法被判定为错误的原因可能与此有关。 因此,总结下来,用户的问题可能源于混淆了不同数据库系统的语法,者引用中的信息存在错误,导致对MODIFYADD的正确用法产生误解。正确的回答需要澄清MODIFYADD的具体功能,并指出不同数据库系统之间的可能差异,同时纠正引用[2]中的错误描述。</think>在SQL中,`ALTER TABLE`语句的`MODIFY``ADD`功能不同,但关于它们“被判定为错误”的说法需结合具体数据库实现语境分析。以下是关键区别与正确用法: --- ### **1. `ADD`的用途** - **作用**:`ADD`用于向表中**添加新字段**,例如新增列约束。 - **语法示例**: ```sql ALTER TABLE 表名 ADD 新列名 数据类型 [约束]; ``` - **示例**: ```sql ALTER TABLE employees ADD email VARCHAR(255); ``` --- ### **2. `MODIFY`的用途** - **作用**:`MODIFY`用于**修改现有字段的属性**,如数据类型、长度约束,但**不能重命名字段**。 - **语法示例**: ```sql ALTER TABLE 表名 MODIFY 列名 新数据类型 [新约束]; ``` - **示例**: ```sql ALTER TABLE employees MODIFY email VARCHAR(100) NOT NULL; ``` --- ### **3. 为何原说法可能被判定为错误?** - **数据库差异**:不同数据库对语法的支持不同: - **MySQL**:使用`MODIFY`修改列属性,`CHANGE`重命名并修改列。 - **Oracle**:仅用`MODIFY`修改列属性,重命名需用`RENAME COLUMN`[^1][^2]。 - **SQL Server**:使用`ALTER COLUMN`修改列,无法直接重命名(需存储过程)[^2]。 - **混淆操作类型**:若误将`MODIFY`用于重命名字段(如MySQL中需用`CHANGE`),会导致错误。 --- ### **4. 常见错误场景** - **错误1**:尝试用`MODIFY`重命名字段: ```sql -- MySQL中错误(应用CHANGE) ALTER TABLE employees MODIFY old_name new_name VARCHAR(100); ``` - **错误2**:跨数据库语法混淆: ```sql -- Oracle中错误(应用RENAME COLUMN) ALTER TABLE employees MODIFY name TO new_name; ``` --- ### **5. 正确用法总结** | 操作类型 | MySQL语法 | Oracle语法 | SQL Server语法 | |----------------|----------------------|-------------------------|-----------------------| | **添加字段** | `ADD 列名 类型` | `ADD 列名 类型` | `ADD 列名 类型` | | **修改字段属性**| `MODIFY 列名 新类型` | `MODIFY 列名 新类型` | `ALTER COLUMN 列名 类型` | | **重命名字段** | `CHANGE 旧列名 新列名` | `RENAME COLUMN 旧列名 TO 新列名` | `EXEC sp_rename`存储过程 | --- ### **相关问题** 1. 如何在MySQL中同时修改列名数据类型? 2. Oracle中如何通过`ALTER TABLE`删除字段? 3. SQL Server的`ALTER COLUMN``MODIFY`有何区别? 4. 修改表结构时如何避免数据丢失? --- 通过明确数据库类型语法规则,可避免`MODIFY``ADD`的误用。具体操作需参考对应数据库的官方文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值