【问题标题】:Use same GUID twice per row每行使用相同的 GUID 两次
【发布时间】:2013-06-16 14:18:53
【问题描述】:

我正在构建一个应用程序,通过 ftp 和 XML 文件将数据从 SQL 服务器传输到异地位置。

我正在通过FOR XML PATH('path'), TYPE 的查询为每个文件构建 XML 数据。

我将使用GUID 来生成文件名以及用作文件中的标识符,目前我获取表的 SQL 如下(简化):

SELECT LVL1.inv_account_no
     , LVL1.cus_postcode
     , CONVERT(varchar(255),NEWID()) + '.xml' as FileName
     , (SELECT (SELECT CONVERT(varchar(255),NEWID()) FOR XML PATH('ident'), TYPE),  (

                SELECT.... [rest of very long nested select code for generating XML]

SQL Fiddle Example

这是给我的:

Account Postcode  FileName                              xCol
AD0001  B30 3HX   2DF21466-2DA3-4D62-8B9B-FC3DF7BD1A00  <ident>656700EA-8FD5-4936-8172-0135DC49D200</ident>
AS0010  NN12 8TN  58339997-8271-4D8C-9C55-403DE98F06BE  <ident>78F8078B-629E-4906-9C6B-2AE21782DC1D</ident>

NEWID() 的每一行/使用的 GUID 基本不同。

有没有一种方法可以在不增加光标或进行两次更新的情况下将相同的 GUID 插入两列?

【问题讨论】:

  • 您是否考虑将值作为字段添加到表中?
  • 没有保证的方法。即使对于SELECT N AS N1, N AS N2 FROM (SELECT NEWID())T(N),它会被评估多少次也是不确定的
  • @BabakNaffas,我确实考虑过将 GUID 添加到表中,唯一的问题是它是多个连接的产物,这意味着标题中的单个 GUID 可以引用 1 到 n 行,我可以只知道如何为每一行添加一个 GUID,然后我必须找到一种方法来可靠地聚合它。

标签: sql-server xml sql-server-2008 guid


【解决方案1】:

试试这样的:

SELECT GeneratedGuid, GeneratedGuid
FROM YourTable
LEFT JOIN (SELECT NEWID() AS GeneratedGuid) AS gg ON 1 = 1

“GeneratedGuid”的每一行都有不同的 GUID。

【讨论】:

    【解决方案2】:

    您可以使用公用表表达式为每个结果行生成 NEWID。

    这里是 SQL 小提琴:http://www.sqlfiddle.com/#!3/74c0c/1

    CREATE TABLE TBL (
       ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
      GCOL VARCHAR(255),
      XCOL XML)
    
    create table tbl2 (
      id int identity(1,1) not null primary key,
      foo int not null )
    
    insert into tbl2 (foo) values
    (10),(20),(30)
    
    ; WITH cte_a as ( select NEWID() as ID )
    INSERT INTO TBL
    SELECT CONVERT(varchar(255),cte_a.ID )
    , (SELECT CONVERT(varchar(255),cte_a.ID) FOR XML PATH('Output'), TYPE)
    from tbl2, cte_a
    

    【讨论】:

    • 我认为根据 Martin 对该问题的警告评论,您不能保证对 cte_a.ID 的每个引用是否会返回相同的值,或者是否会导致每个引用都调用 NEWID() .
    • 是的,它是不确定的,但优化器不会在上面的示例中为同一行调用该方法两次。只要您不使用 2 个不同的别名引用 CTE,NEWID() 每行只会评估一次。我承认我找不到任何支持我的结论的文献,但只要在 FROM 子句中只有 1 个对 CTE 的引用,它就可以在我测试的所有场景中工作。
    【解决方案3】:

    创建一个临时变量并为其分配一个 NEWID()。然后,您可以在 SELECT 或 INSERT 查询中多次使用此变量。临时变量的值保持不变,直到它的范围。在以下示例中,@gid 是一个临时变量,并分配了一个 GUID 值作为 VARCHAR(36)

    DECLARE @gid varchar(36)
    SET @gid = CAST(NEWID() AS VARCHAR(36))
    INSERT INTO [tableName] (col1, col2) VALUES(@gid, @gid)
    

    从 [tablename] 执行上述查询 col1 和 col2 后将具有相同的 guid 值。

    【讨论】:

    • 对你的 sn-p 的简短解释以及为什么它有助于理解 sn-p。
    • @Markus 希望解释对你有帮助
    猜你喜欢
    • 2014-07-03
    • 2018-08-19
    • 1970-01-01
    • 2018-03-30
    • 2013-07-09
    • 2016-08-31
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多