我正在尝试使用引用表来更新代码,但我收到错误:
从字符串转换为时转换失败 唯一标识符
ID是guid: 086B9FE7-3980-47D7-BB05-003708F1D564 ,我想使用的参考代码是4个字符,如 H100 。
当我尝试更改表中的数据类型然后使用参考表中的值更新文件时,我收到了初始错误。我已经尝试过基于其他文章的转换和转换,但即使我成功转换或转换,我仍然会得到相同的消息。
表reftable:
Id | ReportCode
6340FCEA-161C-42F4-8D7F-46B4C2E6C4E2 | H100
数据表:
CauseId
6340FCEA-161C-42F4-8D7F-46B4C2E6C4E2
我正在使用的代码尝试更新。第一个工作,第二个工程带来错误消息:
select cast(nvarchar(36), ID) as ID
from [dbo].[reftable]
UPDATE dbo.datatable
SET causeid = L.reportcode
FROM dbo.datatable S
join dbo.reftable L on S.causeid = L.id
答案 0 :(得分:0)
Uniqueidentifier
是一个特殊的列类型,它包含36个字节,中间有一些连字符。在尝试转换它时,设置一个与其格式不匹配的字符串值将始终失败。
-- Conversion failed when converting from a character string to uniqueidentifier.
SELECT CONVERT(UNIQUEIDENTIFIER, 'H100')
-- OK
SELECT CONVERT(UNIQUEIDENTIFIER, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df')
如果您想使用通用VARCHAR
作为新的causeid
值,则需要先将列类型转换为VARCHAR
(或NVARCHAR
)。
ALTER TABLE dbo.datatable ALTER COLUMN causeid VARCHAR(200) -- NOT NULL if you need
如果您无法更改数据类型,可能是因为链接了INDEX
或CONSTRAINT
。当您尝试更改时,SQL引擎将告诉您哪个对象链接到它。您将不得不删除它们,更改列类型,然后再次创建它们。
我使用这些查询来检查索引和约束。我更新了您桌子的搜索值。
DECLARE @table_name VARCHAR(200) = 'datatable'
DECLARE @column_name VARCHAR(200) = 'causeid'
-- Indexes
SELECT
SchemaName = SCHEMA_NAME(t.schema_id),
TableName = t.name,
IndexName = ind.name,
IndexType = CASE ind.index_id WHEN 0 THEN 'Heap' WHEN 1 THEN 'Clustered' ELSE 'Nonclustered' END,
Disabled = ind.is_disabled,
ColumnOrder = ic.index_column_id,
ColumnName = col.name,
ColumnType = y.name,
ColumnLength = y.max_length,
ColumnIncluded = ic.is_included_column
FROM
sys.indexes ind
INNER JOIN sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN sys.tables t ON ind.object_id = t.object_id
INNER JOIN sys.types y ON y.user_type_id = col.user_type_id
WHERE
t.is_ms_shipped = 0 AND
t.name = @table_name AND
col.name = @column_name
ORDER BY
SchemaName,
t.name,
ind.name,
ic.index_column_id
-- Constraints
SELECT
TableName = t.Name,
ColumnName = c.Name,
dc.Name,
dc.definition
FROM
sys.tables t
INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
WHERE
t.name = @table_name AND
c.name = @column_name
ORDER BY
t.Name