Bu açık döküm neden yalnızca Bağlı Sunucu ile sorunlara neden oluyor?


21

Kaynak sunucuya bir görünüm üzerinden bağlı bir sunucudan veri sorguluyorum. Görünüm gibi standardize edilip, bir çift içermelidir Created, Modifiedve Deleted, ancak bu durumda kaynak sunucuda tablo uygun olan herhangi bir bilgi bulunmamaktadır. Bu nedenle sütunlar açıkça ilgili tiplerine dökülür. Görünümü, bir sütunu değiştirerek güncelledim.

NULL AS Modified

için

CAST(NULL as DateTime) as Modified

Ancak, bu güncelleştirmeyi yaptıktan sonra görünüm aşağıdaki hata iletisini tetikliyor:

Msj 7341, Seviye 16, Durum 2, Satır 3 "" Bağlantılı sunucu "için OLE DB sağlayıcısı" SQLNCLI11 "OLE DB sağlayıcısının" (kullanıcı tarafından oluşturulan ifade) .Expr1002 "satırının geçerli satır değerini alamıyor.

Bu "açık döküm" değişimini genel olarak kaynak sunucu genelinde endişelenmeden değiştirdik ve bu sorunun ilgili sunucuların sürümüyle ilgili olabileceğinden şüpheleniyorum. Gerçekten yok gerek bu döküm uygulamak, ancak temizleyici hissediyor. Şu an bunun neden olduğunu merak ediyorum.

Sunucu Sürümü (başlangıç):

Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 Mayıs 2014 18:34:29 Telif Hakkı (c) Windows NT 6.1'deki Microsoft Corporation Enterprise Edition (64 bit) (Yapı 7601: Service Pack 1) (Hiper Yönetici)

Sunucu Sürümü (bağlantılı):

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Telif Hakkı (c) Windows NT 6.1'de Microsoft Corporation Kurumsal Sürüm (64-bit) (Yapı 7601: Service Pack 1) (Hiper Yönetici) )

Düzenleme
Yaptığımda, söz konusu tüm sütunları göndererek bir hata yaptığımı farkettim ve önemli bir ayrıntıyı bıraktığım için özür dilemeliyim. Bunu daha önce nasıl farketmemiştim bilmiyorum. Yine de soru hala duruyor.

Hatalı döküm, DateTime öğesinin dökümüyle olmaz, ancak UniqueIdentifier öğesine bir sütun yazılır.

Bu suçlu:

CAST(NULL AS UniqueIdentifier) AS [GUID]

UniqueIdentifiers, SQL Server 2008 R2'de desteklenir ve yorumlarda belirtildiği gibi görünüm tarafından gerçekleştirilen sorgu, bağlantılı sunucuda iyi çalışır.


Her sunucuda farklı bir ANSI NULL ayarınız var mı? Farklı harmanlama?
Randolph West

Her iki sunucuda da ANSI NULL = 0 var. Kökeni sunucu harmanlama Danish_Norwegian_CI_ASve bağlı sunucu harmanlama SQL_Danish_Pref_CP1_CI_AS, ancak COLLATEyan tümce DateTimesütunlara uygulanamaz , bu yüzden daha fazla alamadım!
krystah

select Null from ...WITH veya iç içe sorguda ve CASTbaşka bir durumda olsaydı, bu başarısız olur mu?
Ağustos'ta

Açık döküm olmadan, INTbunu yaparak veri türünü değiştirmiş olduğunuz gibi işlem görür . Bunun neden sana bu hata mesajını verdiğini bilmiyorum.
Martin Smith

Daha önce seçilen değerleri bir CTE'ye gerçek değerlerle sarmayı denedim, daha sonra bunları seçip şanssız bir şekilde CTE'yi izleyen ifadedeki döküm NULL'ları yapıştırmaya çalıştım. Önerinizi denedim, NULL’ları CTE’de tutup CTE’yi sorgulayan ifadede yayınladım, ancak aynı hatayı da veriyor.
krystah

Yanıtlar:


13

Böylece CASTuzaktaki durumda değil, yerel olarak yapıldığını fark ettikten sonra hatayı tekrar oluşturabildim . Daha önce bunu düzeltmek umuduyla SP3'e geçmeyi tavsiye ettim (kısmen SP3'teki hatayı tekrar oluşturamadığımdan ve kısmen de olsa iyi bir fikir olduğu için). Ancak, şimdi hatayı yeniden oluşturabildiğim için SP3'e geçmenin hala iyi bir fikir olsa da bunu düzeltmeyeceği açık. Ayrıca, SQL Server 2008 R2 RTM ve 2014 SP1'deki hatayı (her üç vakada da bir "geridönüşüm" yerel Bağlantılı Sunucu kullanarak) yeniden ürettim.

Sorun ile ilgisi var gibi görünüyor nerede sorgu yürütülürken, ya da en azından nerede kısmı (lar) o yürütme edilir. Bunu CAST, çalışmanın çalışmasını sağladığım için söylüyorum , ancak yalnızca yerel bir DB nesnesine bir başvuru ekleyerek:

SELECT rmt.*, CAST(NULL AS UNIQUEIDENTIFIER) AS [GUID]
FROM [Local].[database_name].[dbo].[table_name] rmt
CROSS JOIN (SELECT TOP (1) 1 FROM [sys].[data_spaces]) tmp(dummy);

Bu gerçekten işe yarıyor. Ancak aşağıdaki orijinal hata alır:

SELECT rmt.*, CAST(NULL AS UNIQUEIDENTIFIER) AS [GUID]
FROM [Local].[database_name].[dbo].[table_name] rmt
CROSS JOIN (VALUES (1)) tmp(dummy);

Yerel referanslar olmadığında, tüm sorgunun yürütülecek uzak sisteme gönderildiğini ve bazı nedenlerden dolayı OLE DB sürücüsü tarafından yanlış çevrildiğini veya belki de yanlış çevrildiğini NULLtahmin ediyorum.UNIQUEIDENTIFIERNULL


Yaptığım sınamaya göre, bu bir hata gibi görünüyor, ancak hatanın SQL Server veya SQL Server Native Client / OLEDB sürücüsü içinde olup olmadığından emin değilim. Bununla birlikte, dönüşüm hata OLEDB sürücüsünden oluşur ve bu nedenle mutlaka dönüştürme bir sorun değildir INTiçin UNIQUEIDENTIFIERsürücü yana (SQL Server izin verilmeyen bir dönüşüm) dönüşümleri (SQL Server da değil yapılacak SQL Server kullanmıyor dönüştürme INTiçin izin DATE, ancak henüz OLEDB sürücüsü, testlerden birinde gösterildiği gibi başarılı bir şekilde işler.

Üç test yaptım. Başarılı olan ikisi için, uzaktan yürütülen sorguyu gösteren XML çalıştırma planlarına baktım. Üçü için de, SQL Profiler ile herhangi bir İstisna ya da OLEDB olayını yakaladım:

Olaylar:

  • Hatalar ve Uyarılar
    • Dikkat
    • İstisna
    • Uygulama Uyarıları
    • Kullanıcı Hata Mesajı
  • OLEDB
    • herşey
  • TSQL
    • dışındakilerin tümü :
      • SQL: StmtRecompile
      • XQuery Statik Türü

Sütun Filtreleri:

  • Uygulama Adı
    • % GİBİ DEĞİL % Intellisense%
  • SPID
    • 50'den büyük veya eşit

Testler

  • Test 1

    • CAST(NULL AS UNIQUEIDENTIFIER) bu çalışır

    SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
                 , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
    FROM [Local].[TEMPTEST].[sys].[objects] rmt;

    XML yürütme planının ilgili kısmı:

              <DefinedValue>
                <ColumnReference Column="Expr1002" />
                <ScalarOperator ScalarString="NULL">
                  <Const ConstValue="NULL" />
                </ScalarOperator>
              </DefinedValue>
      ...
    <RemoteQuery RemoteSource="Local" RemoteQuery=
     "SELECT 1 FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;"
     />
  • Test 2

    • CAST(NULL AS UNIQUEIDENTIFIER) bu başarısız

    SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
             --  , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
    FROM [Local].[TEMPTEST].[sys].[objects] rmt;

    (not: Alt soruyu orada tuttum, yorum yaptım, böylece XML izleme dosyalarını karşılaştırdığımda daha az fark olacaktı)

  • Test 3

    • CAST(NULL AS DATE) bu çalışır

    SELECT TOP (2) CAST(NULL AS DATE) AS [Something]
             --  , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
    FROM [Local].[TEMPTEST].[sys].[objects] rmt;

    (not: Alt soruyu orada tuttum, yorum yaptım, böylece XML izleme dosyalarını karşılaştırdığımda daha az fark olacaktı)

    XML yürütme planının ilgili kısmı:

              <DefinedValue>
                <ColumnReference Column="Expr1002" />
                <ScalarOperator ScalarString="[Expr1002]">
                  <Identifier>
                    <ColumnReference Column="Expr1002" />
                  </Identifier>
                </ScalarOperator>
              </DefinedValue>
     ...
    <RemoteQuery RemoteSource="Local" RemoteQuery=
     "SELECT TOP (2) NULL &quot;Expr1002&quot; FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;" 
     />

Test # 3'e bakarsanız SELECT TOP (2) NULL, "uzak" bir sistemde yapıyor. SQL Profiler izlemesi, bu uzak alanın veri tipinin gerçekte olduğunu gösterir INT. İz ayrıca istemci tarafındaki alanın (yani sorguyu çalıştırdığım yer) DATEbeklendiği gibi olduğunu gösteriyor. Dönüşüm INTiçin DATESQL Server bir hata alırsınız şey, OLEDB sürücüsü içinde sadece para cezası çalışır. Uzak değer NULL, yani doğrudan döndürülür, dolayısıyla <ColumnReference Column="Expr1002" />.

Test # 1'e bakarsanız SELECT 1, "uzak" bir sistemde yapıyor. SQL Profiler izlemesi, bu uzak alanın veri tipinin gerçekte olduğunu gösterir INT. İz ayrıca istemci tarafındaki alanın (yani sorguyu çalıştırdığım yer) GUIDbeklendiği gibi olduğunu gösteriyor. Dönüşüm INTiçin GUIDOLEDB sürücüsü içinde sadece para cezası çalışır, SQL Server bir hata alırsınız şey (bu sürücü içinde yapılır ve OLEDB "GUID" diyor, unutmayın). Uzak değer değildir NULL , yani değişmez NULL, yani <Const ConstValue="NULL" />.

Test # 2 başarısız olur, bu nedenle yürütme planı yoktur. Ancak, "uzak" sistemi başarılı bir şekilde sorgular, ancak sonuç kümesini geri alamaz. SQL Profiler'in yakaladığı sorgu:

SELECT TOP (2) NULL "Expr1002" FROM "TEMPTEST"."sys"."objects" "Tbl1001"

Bu, Test # 1'de yapılan aynı sorgunun aynısı, ancak burada başarısız oluyor. Başka küçük farklılıklar da var ama OLEDB iletişimini tam olarak yorumlayamıyorum. Bununla birlikte, uzaktaki alan hala INT(wType = 3 = adInteger / dört bayt işaretli tam sayı / DBTYPE_I4) iken "istemci" alanı hala GUID(wType = 72 = adGUID / global benzersiz tanımlayıcı / DBTYPE_GUID) olarak gösteriliyor. OLE DB belgelerine kadar yardımcı olmuyor GUID Veri Türü Dönüşüm , DBDATE Veri Türü Dönüşümler ve I4 Veri Türü Dönüşümler dönüştürme göstermektedir I4 birine GUID veya DBDATE desteklenmeyen, henüz DATEsorgu çalışır.

Üç sınama için İz XML dosyaları PasteBin'de bulunur. Her testin diğerlerinden farklı olduğu yerlerin ayrıntılarını görmek istiyorsanız, bunları yerel olarak kaydedebilir ve ardından üzerinde bir "fark" yapabilirsiniz. Dosyalar:

  1. NullGuidSuccess.xml
  2. NullGuidError.xml
  3. NullDateSuccess.xml

ERGO?

Bu konuda ne yapmalı? Muhtemelen sadece SQL Native Client - SQLNCLI11- 'in SQL Server 2012 tarihinden itibaren kullanım dışı olduğu göz önüne alındığında, üst kısımda belirttiğim geçici çalışma . SQL Server Native Client konusundaki MSDN sayfalarının çoğu aşağıdaki bildirime sahiptir. üst:

Uyarı

SQL Server Native Client (SNAC), SQL Server 2012'nin ötesinde desteklenmemektedir. Yeni geliştirme çalışmalarında SNAC kullanmaktan kaçının ve şu anda kullanan uygulamaları değiştirmeyi planlayın. SQL Server için Microsoft ODBC sürücüsü , Microsoft SQL Server ve Microsoft Azure SQL Veritabanı Windows'dan ana bağlantı sağlar.

Daha fazla bilgi için lütfen bakınız:


ODBC mi?

ODBC Bağlantılı Sunucuyu şu şekilde kurarım:

EXEC master.dbo.sp_addlinkedserver
  @server = N'LocalODBC',
  @srvproduct=N'{my_server_name}',
  @provider=N'MSDASQL',
  @provstr=N'Driver={SQL Server};Server=(local);Trusted_Connection=Yes;';

EXEC master.dbo.sp_addlinkedsrvlogin
  @rmtsrvname=N'LocalODBC',
  @useself=N'True',
  @locallogin=NULL,
  @rmtuser=NULL,
  @rmtpassword=NULL;

Ve sonra denedi:

SELECT CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
FROM [LocalODBC].[tempdb].[sys].[objects] rmt;

ve aşağıdaki hatayı aldı:

Bağlantılı sunucu için OLE DB sağlayıcısı "MSDASQL" "LocalODBC", "İstenen dönüşüm desteklenmiyor" iletisini döndürdü.
Msj 7341, Seviye 16, Durum 2, Satır 53
Bağlantılı sunucu "LocalODBC" için OLE DB sağlayıcısı "MSDASQL" 'den "(kullanıcı tarafından oluşturulan ifade) .Expr1002" sütununun geçerli satır değeri alınamıyor.


PS

GUID'lerin uzak ve yerel sunucular arasında taşınması ile ilgili olduğu için, NULL olmayan değerler özel bir sözdizimi üzerinden ele alınır. Çalıştığımda, SQL Profiler izlemesinde aşağıdaki OLE DB olay bilgisini fark ettim CAST(0x00 AS UNIQUEIDENTIFIER):

<RemoteQuery RemoteSource="Local" RemoteQuery=
 "SELECT {guid'00000000-0000-0000-0000-000000000000'} &quot;Expr1002&quot; FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;" 
 />

PPS

Ayrıca OPENQUERYaşağıdaki sorguyla test ettim :

SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
     --, (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
FROM   OPENQUERY([Local], N'SELECT 705 AS [dummy] FROM [TEMPTEST].[sys].[objects];') rmt;

ve yerel nesne referansı olmadan bile başarılı oldu. SQL Profiler izleme XML dosyası PasteBin'e şu adresten gönderildi:

NullGuidSuccessOPENQUERY.xml

XML yürütme planı, NULLTest # 1 ile aynı olan bir sabit kullanarak gösteriyor .


Bu sorunu 2012 sp3-cu1'de yeniden yarattım.
Bob Klimes

@BobKlimes İlginç. 2008 R2 örneğine bağlı bir sunucu mu kullanıyor, yoksa geridöngü mü?
Solomon Rutzky,

uzak bağlantılı sunucu 2008 R2 sp2 + MS15-058'dir (10,50,4339,0).
Bob Klimes

1
sürümle ilgili görünmüyor. 2008r2,2012,2014,2016'nın çoklu kombinasyonlarını test etmiş ve şimdiye kadar 2008r2-2008r2 bile hata yapmışlardır.
Bob Klimes

2
Ne kadar karanlık bir mesele. İçgörü ve araştırma için çok teşekkür ederim, @srutzky, büyük beğeni topluyor. Gelecekteki çalışmalar için SNAC'ın beyanını aklımda tutacağım ve yukarıda belirtilen geçici çözümlere geri döneceğim. Harika iş!
krystah,

4

Sadece çirkin bir geçici çözüm var - '1900-01-01'bunun yerine bir tarih sabiti kullanın null.

CAST('1900-01-01' as DateTime) as Modified

İçe aktardıktan sonra 1900-01-01, null değerine sahip sütunları güncelleyebilirsiniz .

Bu, SQL 2012 özelliği / burada başına bir tür hatadır .

Düzenleme: aşağıdaki @a_horse_with_no_name yorumuna göre 1900-00-00geçerli bir tarihle değiştirildi 1900-01-01.


Bu geçici çözüm muhtemelen söylenmeye değerdi, ancak artık OP'nin sorunun suçlularının bir uniqueidentifiersütun olduğunu açıklığa kavuşturduğuyla ilgisi olmayabilir . Ya da belki uyarlanabilir - CAST('00000000-0000-0000-0000-000000000000' AS UniqueIdentifier) AS [GUID]belki de bir şey ?
Andriy M,

Teşekkürler beyler. Boş bir GUID veya DateTime öğesine yayınlama çalışır, ancak bunun neden olduğunu anlamam gerekiyor. Ayrıca hiçbir şey almadığımı da belirtmek gerekir, bu nedenle kaynak verilerini değiştirme imkanı yoktur.
krystah

1
1900-00-00geçersiz bir tarih ve kabul edilmeyecek.
a_horse_with_no_name

@ a_horse_with_no_name: aptal hata, düzeltildi.
Anton Krouglov

2

Sorun, veri türü dönüşümleriyle ilgilidir (yorumlarda da belirtildiği gibi).

Aşağıdakileri göz önünde bulundur:

SELECT NULL as NullColumn INTO SomeTable;
EXEC sp_help SomeTable;
DROP TABLE SomeTable;

NullColumnTürü olduğuna dikkat edin int. SQL Server, intdeğerleri dönüştürmeyi sevmiyor uniqueidentifier. Bu SELECTifade, veri türü dönüştürmede başarısız olur:

--Just a SELECT from nothing
SELECT CAST(CAST(NULL as int) as uniqueidentifier);
--
--or to see it from a physical table:
SELECT NULL as NullColumn INTO SomeTable;
SELECT CAST(NullColumn as uniqueidentifier) FROM SomeTable;
DROP TABLE SomeTable;

Mesaj 529, Seviye 16, Durum 2, Satır 3

İnt veri türünden benzersiz tanımlayıcıya açıkça dönüştürülmesine izin verilmiyor.

Bu belirli değer (NULL) bir GUID'ye verilebilse de, SQL Server, belirli değerlere bakmadan önce veri türü dönüştürmesine bağlı olarak hataya neden olur. Bunun yerine, çok adımlı yapmanız gerekecektir CASTdeğiştireceğim örtülü gitmek operasyonu intile tertemiz bir dönüştürülebilir bir veri türü uniqueidentiferilk döküm --which yollarla varchardaha sonra uniqueidentifier:

--Just a SELECT from nothing
SELECT CAST(CAST(CAST(NULL as int) as varchar) as uniqueidentifier);
--
--or to see it from a physical table:
SELECT NULL as NullColumn INTO SomeTable;
SELECT CAST(CAST(NullColumn as varchar(32)) as uniqueidentifier) FROM SomeTable;
DROP TABLE SomeTable;

Bu sorun gerçekten de, en azından SQL Server dahilindeki veri türü dönüşümlerinden kaynaklanmıyor. Ayrıntılar benim cevabımda , ancak dönüştürme işlemi OLEDB sürücüsü içinde, SQL Server'da değil ve dönüştürme kuralları aynı değil.
Solomon Rutzky,

1

OP nihayetinde bunun uygun bir cevap olup olmadığına karar verebilir.

'Mutlak' bir kanıtım yok, ancak sorunun 'UniqueIdentifer'in sunucuya bağımlı olmasından ve belki de sağlayıcının bu benzersizleştiriciyi almak için hangi sunucuyu (yerel veya uzak) alacağını bulmakta zorluk çektiğinden kaynaklandığından şüpheleniyorum'. boş. Bu nedenle, bu senaryoda muhtemelen başka bir veri türünü başarıyla yayınlayabilirsiniz, ancak benzersizleştirici kullanamazsınız. UNIQUEIDENTIFIERS ve DATETIMEOFFSET gibi 'sunucu' bağımlı olan veri türleri size karşılaştığınız hatayı verecektir.

4-parçalı isim yerine OPENQUERY kullanımı çalışır.

set nocount on  
DECLARE @cmd nVARCHAR(max)
DECLARE @datatype SYSNAME

DECLARE _CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT NAME
FROM sys.types 

OPEN _CURSOR

FETCH NEXT
FROM _CURSOR
INTO @datatype

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        SET @cmd = 'select top 1 cast(null as ' + @Datatype + ') as CastedData from remoteserver.remotedatabase.remoteschema.remotetable'
        PRINT @cmd
        EXECUTE sp_executesql @cmd
    END TRY

    BEGIN CATCH
        PRINT Error_message()
    END CATCH

FETCH NEXT
FROM _CURSOR
INTO @datatype
END --End While

CLOSE _CURSOR

DEALLOCATE _CURSOR

Sunucuya bağımlı olmak Uniqueidentifierve tam olarak ne demek istiyorsunuz DateTimeOffset? Bunun için herhangi bir kaynağınız var mı?
krystah

@krystah - Bu bağlantıyı (Dan technet.microsoft.com/en-us/library/ms190215(v=sql.105).aspx ) "Uniqueidentifier veri türü mağazalar gibi genel benzersiz tanımlayıcı (Guıd) işletmek 16 bayt ikili değerleri Bir GUID, benzersiz bir ikili sayıdır, dünyadaki hiçbir bilgisayar bu GUID değerinin bir kopyasını oluşturmaz .. Bir GUID'in temel kullanımı, birçok sitede birçok bilgisayarı olan bir ağda benzersiz olması gereken bir tanımlayıcı atamaktır. "
Scott Hodgin

DateTimeOffSet için ( msdn.microsoft.com/en-us/library/bb630289.aspx ) Saat dilimi farkındalığı olan ve 24 saatlik bir saati temel alan bir günün saati ile birleştirilen bir tarih tanımlar
Scott Hodgin

Bu iki veri tipinin 'senaryonuzdaki hatayı verenler gibi göründüğü ve bu veri tiplerinin' sunucuya bağımlı 'olduğu için' çıkarım 'derim, sorununun nedeni budur. Sonuçlarınızı görünümünüzden almak ve ek boş yayınları eklemek için OPENQUERY kullanıyorsanız, bu bilgiyi almak için 'nerede' olduğunu bildiği için işe yaraması gerekir
Scott Hodgin

@krystah ve Scott: bu iki veri türü sunucuya bağlı değildir, en azından nasıl tanımladığınız ve ima ettiğiniz konusunda değildir. GUID'ler, altta yatan ikili gösterimlerine bağlı olarak "mimariye" bağlıdır ( ayrıntılar için buraya bakın), ancak eğer burada bir sorun varsa, o zaman hiçbir GUID düzgün şekilde transfer olmaz. DATETIMEOFFSET için, gerçek bir Zaman Dilimi / TimeZoneID bilgisini değil yalnızca bir ofseti bilir. Her ikisi de yeni değerler üretmek için sistem bilgisini kullanırken, burada yeni değerler üretilmez ve bunlar olsaydı, sağlayıcıda üretilmezdi.
Solomon Rutzky,

0

Geçici çözüm: Kabul edilen cevap , OLEDB sürücüsü desteklemediği için dönüşümün yerel olarak yapılması gerektiğini gösteriyor gibi görünüyor.

Bu yüzden basit bir geçici çözümün (en azından uniqueidentifierözyinelemeli bir CTE'nin temel durumunda null seçen sorgumda) boş bir değişken bildirmek olduğunu düşünüyorum:

declare @nullGuid as uniqueidentifier = null;

--Instead of...
CAST(NULL AS UniqueIdentifier) AS [GUID]

--use
@nullGuid AS [GUID]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.