我正在使用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
。
答案 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。