Temp Table给出操作数冲突错误

时间:2013-11-12 20:35:55

标签: 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 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个用户,因此CASE确实处理了所有这些可能性。但是操作数类型冲突正在读取(在INSERT INTO开始的行上)uniqueidentifier is incompatible with tinyint

IDENTITY期间INSERT列是否未自动填充?

编辑:我刚刚意识到知道user表的样子会很有用。它有十几个专栏,但我想从中汲取的是:

id这是主键 username这是一个字符串(用户的uniqueidentifier)

正如您所见,sysrole正在定义

CASE

3 个答案:

答案 0 :(得分:3)

如果您只想为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值。

并且您不需要用于该特定任务的临时表。

答案 1 :(得分:0)

我有一些模糊的回忆,即tinyint只能达到127.你可以查一查。解决方案是将数据类型更改为smallint。

修改 我抬头看了看。我有正确的价值,但对于错误的数据库引擎。解决方案仍然适用。

答案 2 :(得分:0)

tinyint数据类型的大小只有1个字节,并且只能包含0到255之间的值.IDENTITY类型应使用数据类型INT。