私の現在のプロジェクトではかなり見事な監視が行われているため、あるテーブルのvarchar列にいくつかのガイドが格納されており、別のテーブルのuniqueidentifier列と比較する必要があります。
これどうやってするの?SQLサーバーは、文字列から一意の識別子に変換できないと言っているだけです。
私の現在のプロジェクトではかなり見事な監視が行われているため、あるテーブルのvarchar列にいくつかのガイドが格納されており、別のテーブルのuniqueidentifier列と比較する必要があります。
これどうやってするの?SQLサーバーは、文字列から一意の識別子に変換できないと言っているだけです。
SQLがキャストできないと文句を言う場合は、uniqueidentifierをvarcharとして保存しただけでなく、SQL Serverとは異なる形式を使用したことを意味します(たとえば、「{」と「}」を追加しました)。SQLは、適切にフォーマットされている場合、文字列をuniqueidentifierに完全にキャストできます。
declare @u uniqueidentifier;
declare @s varchar(64);
select @u = NEWID();
select @s = CAST(@u as varchar(64));
select CAST(@s as uniqueidentifier), @u, @s;
実際にuniqueidentifierをどのように保存したかに応じて、SQL形式({}なし)に一致するようにデータとコードを変更する必要があります。
uniqueidentifierをvarcharに変換します。
CAST( uniqueidentifier_col_name as varchar)
次のテストスクリプトを作成しました。
DECLARE
@Foo Uniqueidentifier
,@Foo2 varchar(50)
SET @Foo = newid()
SET @Foo2 = newId()
print @Foo
print @Foo2
if @Foo = @Foo2
print 'Yes'
else
print 'No'
set @Foo = @Foo2
if @Foo = @Foo2
print 'Yes'
else
print 'No'
SSMS ウィンドウまたは slqcmd -i ファイルを介して実行すると、結果は同じになります -- SQL (2005) は暗黙的な変換を行います。これは、私が何年も前に同様の問題を抱えていた SQL 2000 から思い出すことを裏付けています。
重要なことは、varchar 文字列が GUID パターンと一致する必要があることです。
他のuniqueidentifierをvarcharにキャストする必要があります。
SQL Serverは、おそらく「bob」などをuniqueidentifierにキャストしようとして失敗します。CAST / CONVERTによると許可されているため、varchar列の値である必要があります。