Sql server 每行使用相同的GUID两次
我正在构建一个应用程序,通过ftp和XML文件将数据从SQL server传输到异地位置 我正在通过一个查询为每个文件构建XML数据,该查询使用Sql server 每行使用相同的GUID两次,sql-server,xml,sql-server-2008,guid,Sql Server,Xml,Sql Server 2008,Guid,我正在构建一个应用程序,通过ftp和XML文件将数据从SQL server传输到异地位置 我正在通过一个查询为每个文件构建XML数据,该查询使用for XML PATH('PATH'),键入 我将使用GUID生成文件名并在文件中用作标识符,目前我获取表的SQL如下(简化): 这给了我: Account Postcode FileName xCol AD0001 B30 3HX 2DF21466-2DA3-4D62-8B9B-FC3
for XML PATH('PATH'),键入
我将使用GUID
生成文件名并在文件中用作标识符,目前我获取表的SQL如下(简化):
这给了我:
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>
帐户邮政编码文件名xCol
AD0001 B30 3HX 2DF21466-2DA3-4D62-8B9B-FC3DF7BD1A00 656700EA-8FD5-4936-8172-0135DC49D200
AS0010 NN12 8TN 58339997-8271-4D8C-9C55-403DE98F06BE 78F8078B-629E-4906-9C6B-2AE21782DC1D
每行/使用NEWID()
的GUID基本不同
有没有一种方法可以在两列中插入相同的GUID,而无需增加光标或进行两次更新?您可以使用公共表表达式为每个结果行生成新ID 下面是SQL小提琴:
试着这样做:
SELECT GeneratedGuid, GeneratedGuid
FROM YourTable
LEFT JOIN (SELECT NEWID() AS GeneratedGuid) AS gg ON 1 = 1
“GeneratedGuid”对于每一行都有不同的GUID。创建一个临时变量并为其分配一个NEWID()。然后,您可以在SELECT或INSERT查询中多次使用此变量。临时变量的值在其范围内保持不变。在以下示例中,@gid是一个临时变量,并将GUID值指定为VARCHAR(36)
执行上述查询后,[tablename]中的col1和col2将具有相同的guid值。是否考虑将该值作为字段添加到表中?没有保证的方法。即使对于
选择N作为N1,N作为N2 FROM(SELECT NEWID())T(N)
@babaknafas,它的计算次数也是不确定的,我确实考虑过将GUID添加到表中,唯一的问题是它是多个联接的产物,这意味着头中的单个GUID可以引用1到N行,我只能解决如何为每一行添加GUID,然后我必须找到一种方法来可靠地汇总它。我认为,根据Martin对这个问题的警告评论,您无法保证对cte_a.ID
的每个引用是否返回相同的值,或者是否会导致NEWID()
正在为每个引用调用。是的,它是不确定的,但在上面的示例中,优化器不会为同一行调用该方法两次。只要不使用两个不同的别名引用CTE,NEWID()
每行只计算一次。我承认我找不到任何文献支持我的结论,但它在我测试的所有场景中都有效,只要在FROM
子句中只有一个CTE引用。对您的代码片段进行简短解释,以及为什么理解代码片段会有帮助。@Markus我希望解释对您有帮助
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
SELECT GeneratedGuid, GeneratedGuid
FROM YourTable
LEFT JOIN (SELECT NEWID() AS GeneratedGuid) AS gg ON 1 = 1
DECLARE @gid varchar(36)
SET @gid = CAST(NEWID() AS VARCHAR(36))
INSERT INTO [tableName] (col1, col2) VALUES(@gid, @gid)