Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 每行使用相同的GUID两次_Sql Server_Xml_Sql Server 2008_Guid - Fatal编程技术网

Sql server 每行使用相同的GUID两次

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

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

我正在通过一个查询为每个文件构建XML数据,该查询使用
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)