Tại sao diễn viên rõ ràng này chỉ gây ra sự cố với Máy chủ được liên kết?


21

Tôi đang truy vấn dữ liệu từ một máy chủ được liên kết thông qua chế độ xem trên máy chủ gốc. Chế độ xem phải bao gồm một vài cột được tiêu chuẩn hóa, chẳng hạn nhưCreated , ModifiedDeletedtrong trường hợp này, bảng trên máy chủ nguồn không có bất kỳ thông tin phù hợp nào. Do đó, các cột được đúc rõ ràng cho các loại tương ứng của chúng. Tôi đã cập nhật chế độ xem, thay đổi một cột từ

NULL AS Modified

đến

CAST(NULL as DateTime) as Modified

Tuy nhiên, sau khi thực hiện cập nhật này, chế độ xem đang kích hoạt thông báo lỗi sau:

Msg 7341, Cấp 16, Trạng thái 2, Dòng 3 Không thể nhận giá trị hàng hiện tại của cột "(biểu thức do người dùng tạo) .Expr1002" từ nhà cung cấp OLE DB "SQLNCLI11" cho máy chủ được liên kết "".

Chúng tôi đã thực hiện việc trao đổi "diễn viên rõ ràng" này trên toàn bộ máy chủ gốc mà không phải lo lắng và tôi nghi ngờ vấn đề này có thể liên quan đến phiên bản của các máy chủ liên quan. Chúng tôi không thực sự cần phải áp dụng dàn diễn viên này, nhưng nó cảm thấy sạch sẽ hơn. Ngay bây giờ tôi chỉ tò mò về lý do tại sao điều này xảy ra.

Phiên bản máy chủ (nguồn gốc):

Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 14 tháng 5 năm 2014 18:34:29 Bản quyền (c) Microsoft Corporation Enterprise Edition (64-bit) trên Windows NT 6.1 (Build 7601: Gói dịch vụ 1) (Hypervisor)

Phiên bản máy chủ (được liên kết):

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 17 tháng 6 năm 2011 00:54:03 Bản quyền (c) Microsoft Corporation Enterprise Edition (64-bit) trên Windows NT 6.1 (Build 7601: Gói dịch vụ 1) (Hypervisor )

Chỉnh sửa
Tôi chỉ nhận ra mình đã phạm sai lầm khi không đăng tất cả các cột trong câu hỏi và tôi phải xin lỗi vì đã bỏ qua một chi tiết quan trọng. Tôi không biết làm thế nào tôi không nhận thấy điều này sớm hơn. Câu hỏi vẫn còn, mặc dù.

Việc truyền sai có thể không xảy ra với việc chuyển sang DateTime, nhưng với một cột được chuyển thành UniqueIdentifier.

Đây là thủ phạm:

CAST(NULL AS UniqueIdentifier) AS [GUID]

UniqueIdentifier được hỗ trợ trên SQL Server 2008 R2 và như đã đề cập trong các nhận xét, truy vấn được thực hiện bởi chế độ xem chạy tốt trên máy chủ được liên kết.


Bạn có cài đặt ANLL NULL khác nhau trên mỗi máy chủ không? Đối chiếu khác nhau?
Randolph West

Cả hai máy chủ đều có ANSI NULL = 0. Máy chủ gốc có đối chiếu Danish_Norwegian_CI_ASvà máy chủ được liên kết có đối chiếu SQL_Danish_Pref_CP1_CI_AS, nhưng COLLATEmệnh đề không thể được áp dụng cho DateTimecác cột, vì vậy tôi không nhận được nhiều hơn nữa!
kstallah

Điều này sẽ thất bại nếu có select Null from ...trong truy vấn VỚI hoặc lồng nhau và CASTtrong một truy vấn khác?
Stoleg

Nếu không có cast cast rõ ràng, nó sẽ được xử lý vì INTvậy bạn đã thay đổi kiểu dữ liệu bằng cách làm như vậy. Tôi không biết tại sao điều đó sẽ cung cấp cho bạn thông báo lỗi đó mặc dù.
Martin Smith

Trước đây tôi đã cố gắng bọc các giá trị đã chọn bằng các giá trị thực tế trong CTE, sau đó chọn chúng và xử lý các NULL được truyền trong tuyên bố sau CTE mà không gặp may. Tôi đã thử đề xuất của bạn, giữ các NULL trong CTE và truyền chúng trong câu lệnh truy vấn CTE, nhưng nó cũng dẫn đến lỗi tương tự.
kstallah

Câu trả lời:


13

Vì vậy, tôi đã có thể tái tạo lỗi sau khi nhận ra rằng việc CASTđó đang được thực hiện cục bộ chứ không phải trên trường hợp từ xa. Trước đây tôi đã đề nghị chuyển lên SP3 với hy vọng sửa lỗi này (một phần do không thể tái tạo lỗi trên SP3 và một phần do đó là một ý tưởng tốt bất kể). Tuy nhiên, bây giờ tôi có thể tái tạo lỗi, rõ ràng việc chuyển lên SP3, trong khi vẫn có thể là một ý tưởng tốt, sẽ không khắc phục điều này. Và tôi cũng đã tái tạo lỗi trong SQL Server 2008 R2 RTM và 2014 SP1 (sử dụng Máy chủ được liên kết cục bộ "loop-back" trong cả ba trường hợp).

Có vẻ như vấn đề này liên quan đến nơi truy vấn đang thực thi hoặc ít nhất là nơi một phần của nó đang thực thi. Tôi nói điều này bởi vì tôi có thể làm cho CASThoạt động hoạt động, nhưng chỉ bằng cách bao gồm một tham chiếu đến một đối tượng DB cục bộ:

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);

Điều đó thực sự hoạt động. Nhưng sau đây nhận được lỗi ban đầu:

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

Tôi đoán rằng khi không có tài liệu tham khảo cục bộ, toàn bộ truy vấn sẽ được chuyển đến hệ thống từ xa để thực thi và vì một số lý do NULLkhông thể chuyển đổi thành UNIQUEIDENTIFIER, hoặc có lẽ NULLdo trình điều khiển OLE DB dịch sai.


Dựa trên thử nghiệm mà tôi đã thực hiện, đây có thể là một lỗi, nhưng tôi không chắc liệu lỗi đó có nằm trong SQL Server hay trình điều khiển SQLB Client Client / OLEDB không. Tuy nhiên, lỗi chuyển đổi xảy ra trong trình điều khiển OLEDB và do đó không nhất thiết là vấn đề chuyển đổi từ INTsang UNIQUEIDENTIFIER(một chuyển đổi không được phép trong SQL Server) do trình điều khiển không sử dụng SQL Server để thực hiện chuyển đổi (SQL Server cũng không cho phép chuyển đổi INTsang DATE, nhưng trình điều khiển OLEDB xử lý thành công, như thể hiện trong một trong các thử nghiệm).

Tôi đã chạy ba bài kiểm tra. Đối với hai người đã thành công, tôi đã xem xét các kế hoạch thực hiện XML hiển thị truy vấn đang được thực hiện từ xa. Đối với cả ba, tôi đã nắm bắt bất kỳ Ngoại lệ hoặc sự kiện OLEDB nào thông qua SQL Profiler:

Sự kiện:

  • Lỗi và cảnh báo
    • Chú ý
    • ngoại lệ
    • Cảnh báo thực thi
    • Thông báo lỗi người dùng
  • OLEDB
    • tất cả các
  • TSQL
    • tất cả ngoại trừ :
      • SQL: StmtRecompile
      • Kiểu tĩnh XQuery

Bộ lọc cột:

  • Tên ứng dụng
    • KHÔNG THÍCH % Intellisense%
  • SPID
    • Lớn hơn hoặc bằng 50

CÁC BÀI KIỂM TRA

  • Kiểm tra 1

    • CAST(NULL AS UNIQUEIDENTIFIER) nó hoạt động

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

    Phần có liên quan của kế hoạch thực hiện XML:

              <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;"
     />
  • Kiểm tra 2

    • CAST(NULL AS UNIQUEIDENTIFIER) thất bại

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

    (lưu ý: Tôi đã giữ truy vấn con trong đó, nhận xét, để nó sẽ khác biệt ít hơn khi tôi so sánh các tệp theo dõi XML)

  • Bài kiểm tra 3

    • CAST(NULL AS DATE) nó hoạt động

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

    (lưu ý: Tôi đã giữ truy vấn con trong đó, nhận xét, để nó sẽ khác biệt ít hơn khi tôi so sánh các tệp theo dõi XML)

    Phần có liên quan của kế hoạch thực hiện XML:

              <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;" 
     />

Nếu bạn nhìn vào Bài kiểm tra số 3, thì nó đang thực hiện SELECT TOP (2) NULLtrên hệ thống "từ xa". Theo dõi SQL Profiler cho thấy kiểu dữ liệu của trường từ xa này trên thực tế INT. Theo dõi cũng cho thấy trường ở phía máy khách (tức là nơi tôi đang chạy truy vấn từ đó) DATE, như mong đợi. Việc chuyển đổi từ INTsang DATE, một cái gì đó sẽ gặp lỗi trong SQL Server, chỉ hoạt động tốt trong trình điều khiển OLEDB. Giá trị từ xa là NULL, do đó, nó được trả về trực tiếp, do đó <ColumnReference Column="Expr1002" />.

Nếu bạn nhìn vào Bài kiểm tra số 1, thì nó đang thực hiện SELECT 1trên hệ thống "từ xa". Theo dõi SQL Profiler cho thấy kiểu dữ liệu của trường từ xa này trên thực tế INT. Theo dõi cũng cho thấy trường ở phía máy khách (tức là nơi tôi đang chạy truy vấn từ đó) GUID, như mong đợi. Việc chuyển đổi từ INTsang GUID(hãy nhớ, điều này được thực hiện trong trình điều khiển và OLEDB gọi đó là "GUID"), một cái gì đó sẽ gặp lỗi trong SQL Server, chỉ hoạt động tốt trong trình điều khiển OLEDB. Giá trị từ xa là không NULL , vì vậy nó được thay thế bằng một nghĩa đen NULL, do đó <Const ConstValue="NULL" />.

Thử nghiệm # 2 thất bại, vì vậy không có kế hoạch thực hiện. Tuy nhiên, nó truy vấn hệ thống "từ xa" thành công, nhưng không thể trả lại tập kết quả. Truy vấn mà SQL Profiler thu được là:

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

Đó là cùng một truy vấn đang được thực hiện trong Bài kiểm tra số 1, nhưng ở đây nó không thành công. Có những khác biệt nhỏ khác, nhưng tôi không thể diễn giải đầy đủ thông tin liên lạc OLEDB. Tuy nhiên, trường từ xa vẫn hiển thị dưới dạng INT(wType = 3 = adInteger / số nguyên có chữ ký bốn byte / DBTYPE_I4) trong khi trường "client" vẫn hiển thị dưới dạng GUID(wType = 72 = adGUID / định danh duy nhất toàn cầu / DBTYPE_GUID). Tài liệu OLE DB không giúp ích nhiều vì Chuyển đổi loại dữ liệu GUID , Chuyển đổi loại dữ liệu DBDATEChuyển đổi loại dữ liệu I4 cho thấy việc chuyển đổi từ I4 sang GUID hoặc DBDATE không được hỗ trợ, nhưng DATEtruy vấn vẫn hoạt động.

Các tệp Trace XML cho ba bài kiểm tra được đặt trên PasteBin. Nếu bạn muốn xem chi tiết về nơi mỗi bài kiểm tra khác với các bài kiểm tra khác, bạn có thể lưu chúng cục bộ và sau đó thực hiện "khác biệt" với chúng. Các tập tin là:

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

LỚN?

Phải làm gì về nó? Có lẽ chỉ là phần giải quyết mà tôi đã lưu ý trong phần trên cùng, với điều kiện Máy khách bản địa SQL - SQLNCLI11- không được dùng cho SQL Server 2012. Hầu hết các trang MSDN về chủ đề Máy khách bản địa của SQL Server đều có thông báo sau tại hàng đầu:

Cảnh báo

SQL Server Client Client (SNAC) không được hỗ trợ ngoài SQL Server 2012. Tránh sử dụng SNAC trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng nó. Các điều khiển Microsoft ODBC cho SQL Server cung cấp kết nối có nguồn gốc từ Windows sang Microsoft SQL Server và cơ sở dữ liệu Microsoft Azure SQL.

Để biết thêm thông tin, vui lòng xem:


ODBC ??

Tôi đã thiết lập Máy chủ được liên kết ODBC thông qua:

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;

Và sau đó thử:

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

và nhận được lỗi sau:

Nhà cung cấp OLE DB "MSDASQL" cho máy chủ được liên kết "LocalODBC" thông báo trả về "Chuyển đổi được yêu cầu không được hỗ trợ."
Msg 7341, Cấp 16, Trạng thái 2, Dòng 53
Không thể nhận giá trị hàng hiện tại của cột "(biểu thức do người dùng tạo) .Expr1002" từ nhà cung cấp OLE DB "MSDASQL" cho máy chủ được liên kết "LocalODBC".


PS

Vì nó liên quan đến việc vận chuyển GUID giữa các máy chủ từ xa và cục bộ, các giá trị không phải NULL được xử lý thông qua một cú pháp đặc biệt. Tôi nhận thấy thông tin Sự kiện OLE DB sau trong theo dõi SQL Profiler khi tôi chạy 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

Tôi cũng đã thử nghiệm OPENQUERYvới truy vấn sau:

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;

và nó đã thành công, thậm chí không có tham chiếu đối tượng địa phương. Tệp XML theo dõi SQL Profiler đã được đăng lên PasteBin tại:

NullGuidSuccessOPENQUERY.xml

Kế hoạch thực hiện XML cho thấy nó sử dụng NULLhằng số, giống như trong Thử nghiệm # 1.


Tôi đã tạo lại vấn đề này vào năm 2012 sp3-cu1.
Bob Klimes

@BobKlimes Thú vị. Có phải đó là sử dụng máy chủ được liên kết với phiên bản 2008 R2 hoặc loop-back?
Solomon Rutzky

máy chủ được liên kết từ xa là 2008 R2 sp2 + MS15-058 (10.50.4339.0).
Bob Klimes

1
dường như không liên quan đến phiên bản. Đã thử nghiệm nhiều combo của 2008r2,2012,2014,2016 và tất cả đều có lỗi sản xuất, thậm chí 2008r2-2008r2.
Bob Klimes

2
Thật là một vấn đề cực kỳ mơ hồ. Cảm ơn bạn rất nhiều vì cái nhìn sâu sắc và nghiên cứu, @srutzky, nó được đánh giá rất cao. Tôi sẽ ghi nhớ sự suy giảm của SNAC cho công việc trong tương lai và dự phòng cho cách giải quyết đã nói ở trên. Công việc tuyệt vời
kstallah

4

Chỉ có một cách giải quyết xấu xí - sử dụng hằng số ngày như '1900-01-01'thay vì null.

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

Sau khi nhập, bạn có thể cập nhật các cột với 1900-01-01 trở lại thành Null.

Đây là loại tính năng / lỗi SQL 2012 theo đây .

Chỉnh sửa: được thay thế 1900-00-00bằng ngày hợp lệ 1900-01-01theo nhận xét @a_horse_with_no_name bên dưới.


Cách giải quyết này có lẽ đáng được đề cập nhưng có thể không còn phù hợp nữa khi OP đã làm rõ rằng thủ phạm của vấn đề là một uniqueidentifiercột. Hoặc có lẽ nó có thể được điều chỉnh - một cái gì đó như CAST('00000000-0000-0000-0000-000000000000' AS UniqueIdentifier) AS [GUID], có lẽ?
Andriy M

Cảm ơn các bạn. Truyền tới một GUID hoặc DateTime trống hoạt động, nhưng tôi cần hiểu tại sao điều này xảy ra. Điều đáng nói là tôi không nhập bất cứ thứ gì, vì vậy không có khả năng thay đổi dữ liệu nguồn.
kstallah

1
1900-00-00là một ngày không hợp lệ và sẽ không được chấp nhận.
a_horse_with_no_name

@a_horse_with_no_name: lỗi ngu ngốc, đã sửa.
Anton Krouglov

2

Vấn đề liên quan đến chuyển đổi loại dữ liệu (như được nhấn trong các bình luận).

Hãy xem xét những điều sau đây:

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

Lưu ý rằng đó NullColumnlà loại int. SQL Server không thích chuyển đổi intgiá trị thành uniqueidentifier. Đây SELECTtuyên bố sẽ thất bại trên một chuyển đổi kiểu dữ liệu:

--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;

Msg 529, cấp 16, bang 2, dòng 3

Không được phép chuyển đổi rõ ràng từ kiểu dữ liệu int sang mã định danh.

Mặc dù giá trị cụ thể này (NULL) có thể được chuyển thành GUID, SQL Server sẽ đưa ra lỗi dựa trên chuyển đổi loại dữ liệu, thậm chí trước khi xem xét các giá trị cụ thể. Thay vào đó, bạn sẽ cần thực hiện một thao tác gồm nhiều bước CASTđể thay đổi ẩn intthành một kiểu dữ liệu có thể được chuyển đổi hoàn toàn thành uniqueidentifer- nghĩa là trước tiên chuyển sang varcharsau 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;

Vấn đề này không thực sự do chuyển đổi kiểu dữ liệu, ít nhất là không nằm trong SQL Server. Chi tiết có trong câu trả lời của tôi , nhưng việc chuyển đổi đang được thực hiện trong trình điều khiển OLEDB, không phải trong SQL Server và các quy tắc chuyển đổi không giống nhau.
Solomon Rutzky

1

OP cuối cùng có thể quyết định nếu đây là một câu trả lời thích hợp.

Tôi không có bằng chứng 'tuyệt đối', nhưng tôi 'nghi ngờ' vấn đề bắt nguồn từ việc UniqueIdentifer phụ thuộc vào máy chủ và có lẽ nhà cung cấp đang gặp khó khăn trong việc tìm ra máy chủ nào (cục bộ hoặc từ xa) để lấy thông tin nhận dạng này, mặc dù nó vô giá trị. Đó là lý do tại sao bạn có thể sử dụng bất kỳ kiểu dữ liệu nào khác thành công trong kịch bản này, nhưng không phải là định danh duy nhất. Các loại dữ liệu phụ thuộc vào 'máy chủ' như UNIQUEIDENTIFIERS và DATETIMEOFFSET sẽ cung cấp cho bạn lỗi bạn gặp phải.

Sử dụng OPENQUERY thay vì tên 4 phần hoạt động.

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

Chính xác thì bạn có ý nghĩa gì UniqueidentifierDateTimeOffsetphụ thuộc vào máy chủ? Bạn có nguồn nào cho việc này không?
kstallah

@krystah - Từ liên kết này ( technet.microsoft.com/en-us/l Library / ms190215 (v = sql.105 ). GUID là một số nhị phân duy nhất, không có máy tính nào khác trên thế giới tạo ra một bản sao của giá trị GUID đó. Công dụng chính của GUID là gán một mã định danh phải là duy nhất trong một mạng có nhiều máy tính tại nhiều trang web. "
Scott Hodgin

Đối với DateTime Offerset ( msdn.microsoft.com/en-us/l Library / bb630289.aspx ) Xác định ngày được kết hợp với thời gian trong ngày có nhận thức về múi giờ và dựa trên đồng hồ 24 giờ
Scott Hodgin

Tôi 'suy luận' rằng, vì hai loại dữ liệu này 'dường như' là loại duy nhất gây ra lỗi trong kịch bản của bạn và các loại dữ liệu đó là 'phụ thuộc vào máy chủ', đó là lý do cho vấn đề của bạn. Nếu bạn sử dụng OPENQUERY để truy xuất kết quả của bạn từ chế độ xem của bạn và thêm các phôi null bổ sung, nó sẽ hoạt động vì nhà cung cấp biết 'nơi' để lấy thông tin đó
Scott Hodgin

@krystah và Scott: hai kiểu dữ liệu này không phụ thuộc vào máy chủ, ít nhất là không phải trong cách bạn mô tả và ngụ ý. GUID là "kiến trúc" phụ thuộc vào biểu diễn nhị phân cơ bản của chúng (xem chi tiết tại đây ), nhưng nếu đó là một vấn đề ở đây, thì không có GUID nào chuyển đúng. Đối với DATETIMEOFFSET, chỉ biết về phần bù, không biết về Múi giờ / TimeZoneID thực tế. Mặc dù cả hai đều sử dụng thông tin hệ thống để tạo các giá trị mới, nhưng không có giá trị mới nào được tạo ở đây và nếu có, chúng sẽ không được tạo trong nhà cung cấp.
Solomon Rutzky

0

Cách giải quyết: Câu trả lời được chấp nhận dường như chỉ ra rằng việc chuyển đổi cần diễn ra cục bộ vì trình điều khiển OLEDB không hỗ trợ nó.

Vì vậy, tôi nghĩ rằng một cách giải quyết đơn giản (ít nhất là trong trường hợp truy vấn của tôi đang chọn null uniqueidentifiertrong trường hợp cơ sở của CTE đệ quy) là khai báo biến null:

declare @nullGuid as uniqueidentifier = null;

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

--use
@nullGuid AS [GUID]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.