Sql 临时表给出操作数冲突错误

Sql 临时表给出操作数冲突错误,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我使用CASE语句来帮助填充临时表,但由于某些原因,我得到了一个操作数类型冲突错误: CREATE TABLE #users ( id INT IDENTITY (1, 1), userid UNIQUEIDENTIFIER, username VARCHAR(50), sysrole VARCHAR(50) ) --Insert all loadtest users into temp table INSERT IN

我使用
CASE
语句来帮助填充临时表,但由于某些原因,我得到了一个操作数类型冲突错误:

CREATE TABLE #users 
  ( 
     id       INT IDENTITY (1, 1), 
     userid   UNIQUEIDENTIFIER, 
     username VARCHAR(50),
     sysrole VARCHAR(50) 
  ) 

--Insert all loadtest users into temp table
INSERT INTO #users 
            (userid, 
             username,
             sysrole) 
SELECT id, 
       username,
       sysrole =
       CASE 
            WHEN id between 0 and 100 THEN '63F7971B-45FF-4E3C-86E7-9D0507AF60C0'
            WHEN id between 101 and 200 THEN '26478736-7937-4E52-891B-E80A8D609693'
            WHEN id between 201 and 300 THEN 'CEF5F44F-0961-414C-8578-22BEB0C4B9FF'
            WHEN id between 301 and 400 THEN '63F7971B-45FF-4E3C-86E7-9D0507AF60C0'
            WHEN id between 401 and 500 THEN '7FD13C9E-731B-43AE-95F0-E9AEDC65759C'
        END
FROM   user 
WHERE  username LIKE '%Test%' 
有500个用户,因此本案例处理了所有这些可能性。但是,操作数类型冲突正在读取(在插入开始的行上)
uniqueidentifier与tinyint
不兼容

插入期间,
标识
列是否未自动填充

编辑:我刚刚意识到了解
user
表是什么样子会很有用。它大约有十几列,但我想从中提取的是:

id
哪个是主键
username
这是一个字符串(用户上的唯一标识符)


sysrole
案例定义,如您所见。

我模糊地记得tinyint仅上升到127。你可以查一下。解决方案是将数据类型更改为smallint

编辑
我查了一下。我有正确的值,但数据库引擎错误。但解决方案仍然适用。

tinyint数据类型的大小只有1字节,并且只能有0到255之间的值。标识类型应该使用datatype INT.

< p>如果只想将五个字符串值任意分配给500个用户,一个到100个,则应该考虑一个不同的方法:

WITH enumerated AS (
  SELECT
    id,
    username,
    rn = ROW_NUMBER() OVER (ORDER BY username)
  FROM user
  WHERE username LIKE '%test%'
)
SELECT
  rn,
  id,
  username,
  sysrole = CASE 
    WHEN rn between 0 and 100 THEN '63F7971B-45FF-4E3C-86E7-9D0507AF60C0'
    WHEN rn between 101 and 200 THEN '26478736-7937-4E52-891B-E80A8D609693'
    WHEN rn between 201 and 300 THEN 'CEF5F44F-0961-414C-8578-22BEB0C4B9FF'
    WHEN rn between 301 and 400 THEN '63F7971B-45FF-4E3C-86E7-9D0507AF60C0'
    WHEN rn between 401 and 500 THEN '7FD13C9E-731B-43AE-95F0-E9AEDC65759C'
  END
FROM enumerated
;
enumerated
子查询将行号分配给所选行,主查询使用这些行号分配
sysrole


您不需要为该特定任务创建临时表。

应该是这样,那么为什么您要在临时表中插入
id
而不是
userid
?!打字错误它应该是来自用户的
,这是一个不同的表。那里的PK称为
id
,而不是
userid
。因此,如果PK是id,并且可能是tinyint,那么为什么要将其插入guid列中?看看我的答案。抱歉,如果我误解了,看到
user
模式会有所帮助。您正在将
user.id
(这是
TINYINT
)插入
users.userid
,这是一个
uniqueidentifier
。如果user.id是uniqueidentifier,那么where子句究竟为什么会在301和400之间显示
?对于GUID列,这怎么可能是真的?假设它是255。无论如何,对于标识列来说太小了。同意,只有极小值是0到255。很好。我改了。虽然没有解决问题,但同样的错误仍然存在。很好的捕获。我更改了它,但错误仍然存在。奇怪的是,所有对Tinyint的引用现在都被删除了,尽管我确保删除了创建的表并清除了缓冲区(以确保它不会粘在那里)。试试这个:[int]IDENTITY(1,1)NOT NULL,(不知道NOT NULL是否重要)这绝对是一个比我试图破解的更优雅的方法。实际上,我最终打算重构代码,试图找出如何实现这种方法(我仍在学习一些东西),但我希望我的“黑客组合”查询能够满足要求,直到我成功做到这一点。我也从来没有考虑过CTE(即使它真的是最好的答案)。谢谢你的帮助,给了我更多的阅读@SeanLong:在这种特殊情况下,它也可能是一个“普通”子选择(
SELECT…FROM(SELECT…
),只是CTE通常更具可读性。(尽管这可能是主观的。)我认为从长远来看,CTE将运行得更好。这将使更新和读取变得更容易,而且这并不是代码的全部(我最初使用临时表的原因是我需要遍历每一行并在单独的存储过程中使用这些值)。不过,后一部分肯定是我可以处理的,这使得
CASE
语句更容易处理。