web-dev-qa-db-ja.com

SQLServer-uniqueidentifier値をcharに変換するには結果スペースが不十分です

あるテーブルから別のテーブルにデータをコピーしているときにSQLクエリを実行すると、以下のエラーが発生します。

メッセージ8170、レベル16、状態2、行2uniqueidentifier値をcharに変換するには結果スペースが不十分です。

私のSQLクエリは、

INSERT INTO dbo.cust_info (
uid,
first_name,
last_name
)
SELECT
NEWID(),
first_name,
last_name
FROM dbo.tmp_cust_info

私のテーブル作成スクリプトは、

CREATE TABLE [dbo].[cust_info](
    [uid] [varchar](32) NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

CREATE TABLE [dbo].[tmp_cust_info](
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

NEWID()に問題があると確信しています。取り出して文字列に置き換えると、機能します。

私はどんな助けにも感謝します。前もって感謝します。

13
Sam Keith

GUIDには36文字が必要です(ダッシュのため)。 32文字の列のみを指定します。十分ではないため、エラーが発生します。

30
Remus Rusanu

3つの選択肢のいずれかを使用する必要があります

1、16バイトとして内部的に格納するuniqueidentifier列。この列から選択すると、8-4-4-4-12形式を使用して自動的にレンダリングされます表示用

CREATE TABLE [dbo].[cust_info](
    [uid] uniqueidentifier NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

2、非推奨フィールドをchar(36)に変更して、ダッシュを含む形式に適合するようにします。

CREATE TABLE [dbo].[cust_info](
    [uid] char(36) NOT NULL,
    [first_name] [varchar](100) NULL,
    [last_name] [varchar](100) NULL)

3、非推奨 32文字のコンポーネントと同様に、ダッシュなしで保存します

INSERT INTO dbo.cust_info (
uid,
first_name,
last_name
)
SELECT
replace(NEWID(),'-',''),
first_name,
last_name
FROM dbo.tmp_cust_info
7
RichardTheKiwi

Guidは36文字を取るため、uid列の長さをvarchar(32)-> varchar(36)から増やします。Guid.NewGuid()。ToString()-> 36文字の出力:12345678-1234-1234-1234-123456789abc

1