Sql server 此T-SQL查询已完成,但出现错误:列名无效,请提供帮助

Sql server 此T-SQL查询已完成,但出现错误:列名无效,请提供帮助,sql-server,tsql,Sql Server,Tsql,我使用以下SQL语句来选择DB表中不存在的随机值: select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF) 已完成,但出现错误:列名无效 我找不到办法,请帮忙 谢谢! William不幸的是,在where子句中不能使用别名(“as NEW_DVAL”)。您可以这样做: select NEW_DVAL from (

我使用以下SQL语句来选择DB表中不存在的随机值:

select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL
WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF)
已完成,但出现错误:列名无效

我找不到办法,请帮忙

谢谢!
William

不幸的是,在where子句中不能使用别名(“as NEW_DVAL”)。您可以这样做:

 select NEW_DVAL from (
   select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL
 ) a
 WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF)
然而,我怀疑您的查询无论如何都不会满足您的要求。“select convert(…)”位将为您提供一行,“where”位将过滤掉或不过滤掉该行

如果随机选择的新dval已经存在,查询将不返回任何行-在找到未使用的行之前,它不会自动循环


请查看此问题的解决方案。

不幸的是,在where子句中不能使用别名(“as NEW\u DVAL”)。您可以这样做:

 select NEW_DVAL from (
   select CONVERT(INT, 1 + 999999999 * rand()) as NEW_DVAL
 ) a
 WHERE NEW_DVAL NOT IN (SELECT FIELD_DVAL FROM dbo.MASTER_REF)
然而,我怀疑您的查询无论如何都不会满足您的要求。“select convert(…)”位将为您提供一行,“where”位将过滤掉或不过滤掉该行

如果随机选择的新dval已经存在,查询将不返回任何行-在找到未使用的行之前,它不会自动循环


请查看此问题的解决方案。

如果您想要保证返回值,除非该表包含所有可能的值,否则您需要在碰撞时不断生成新的随机数,类似于:

DECLARE @NEW_DVAL AS INT;

WHILE 1=1
BEGIN
   SET @NEW_DVAL = CONVERT(INT, 1 + 999999999 * RAND());

   IF NOT EXISTS(SELECT * FROM dbo.MASTER_REF WHERE @NEW_DVAL = FIELD_DVAL)
      BREAK;
END;

SELECT @NEW_DVAL;

如果您想要一个保证返回值,除非该表包含所有可能的值,否则您需要在碰撞时不断生成新的随机数,类似于:

DECLARE @NEW_DVAL AS INT;

WHILE 1=1
BEGIN
   SET @NEW_DVAL = CONVERT(INT, 1 + 999999999 * RAND());

   IF NOT EXISTS(SELECT * FROM dbo.MASTER_REF WHERE @NEW_DVAL = FIELD_DVAL)
      BREAK;
END;

SELECT @NEW_DVAL;

问题是,当发生冲突时,它将返回空记录集,迫使调用方重复执行,直到返回值Hanks Blorgbeard!“这太棒了!”威廉:没问题,但也看看伊万诺夫的答案。当发生碰撞时,我的解决方案将失败。是的,我检查了。我最初的设计将冲突避免留给用户(调用者)逻辑。问题是,当发生冲突时,它将返回空记录集,迫使调用者重复执行,直到返回值Hanks Blorgbeard!“这太棒了!”威廉:没问题,但也看看伊万诺夫的答案。当发生碰撞时,我的解决方案将失败。是的,我检查了。我最初的设计将冲突避免留给用户(调用者)逻辑。但是,当然,如果您计划将该值用于
INSERT
插入MASTER\u REF,您最好将此
SELECT
循环和
INSERT
封装在具有适当隔离(或锁定提示)的事务中,否则,在尝试插入
时,未使用的ID值可能已被另一个连接插入。但是,当然,如果您计划将该值用于
插入到MASTER\u REF中,最好将此
选择
循环和
插入
封装在具有适当隔离的事务中(或锁定提示)-否则,在尝试插入时,未使用的ID值可能已被其他连接插入。