Sql server 此T-SQL查询已完成,但出现错误:列名无效,请提供帮助
我使用以下SQL语句来选择DB表中不存在的随机值: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 (
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值可能已被其他连接插入。