需要将GUID更改为varchar或char

时间:2018-03-12 19:13:29

标签: sql-server sql-server-2008 tsql guid

我正在尝试使用引用表来更新代码,但我收到错误:

  

从字符串转换为时转换失败   唯一标识符

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

1 个答案:

答案 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

如果您无法更改数据类型,可能是因为链接了INDEXCONSTRAINT。当您尝试更改时,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