簡體   English   中英

如何將文本數據類型從PostgreSQL數據庫轉換/廣播到鏈接的MS SQL Server?

[英]How can you convert/cast text datatypes from a PostgreSQL database to a linked MS SQL Server?

早上好/下午好! 大部分時間都在解決這個問題,所以我認為是時候吸引更多的受眾了。

我正在運行Microsoft SQL Server2012。已創建到PostgreSQL服務器的“鏈接服務器”。 當我嘗試向PostgreSQL服務器發出查詢時,得到以下信息:

SELECT *
FROM OPENQUERY(MYDB, 'SELECT notes from remote_view LIMIT 50');

Msg 7347, Level 16, State 1, Line 1
OLE DB provider 'MSDASQL' for linked server 'MYDB' returned data that does not match expected data length for column '[MSDASQL].notes'. The (maximum) expected data length is 8000, while the returned data length is 9088.

如果我截斷該字段(使用LEFT(notes, 4000) ),我可以使其工作。 PostgreSQL表上的字段是“文本”數據類型。

有什么想法如何使數據得以傳播而不丟失嗎?

更新#1:

嘗試將值轉換為varchar(max)產生以下結果:

SELECT *
FROM OPENQUERY(MYDB, 'SELECT cast(notes as varchar(max)) as notes2 from remote_view LIMIT 50');

OLE DB provider "MSDASQL" for linked server "QPID" returned message "ERROR: syntax error at or near "max";
No query has been executed with that handle".
Msg 7350, Level 16, State 2, Line 1
Cannot get the column information from OLE DB provider "MSDASQL" for linked server "QPID".

如果我嘗試將其varchar(8000)varchar(8000) ,它將得到以下信息:

OLE DB provider "MSDASQL" for linked server "QPID" returned message "Requested conversion is not supported.".

這就是我想出的解決此問題的方法。 在OPENQUERY內部,將主文本字段分成幾個較小的VARCHAR字段。 為此,請將字段CAST設置為非常大的VARCHAR值。 然后執行該值的LEFT / SUBSTRING,以獲取其中的一小部分。 在OPENQUERY CAST之外,您創建為VARCHAR(MAX)的每個字段並將它們連接在一起。 使用原始示例,將是這樣。

SELECT CAST(Notes1 AS VARCHAR(MAX)) 
       + CAST(Notes2 AS VARCHAR(MAX)) 
       ... 
       + CAST(Notes5 AS VARCHAR(MAX)) AS Notes
FROM OPENQUERY(MYDB, 'SELECT 
                        LEFT(CAST(Notes AS VARCHAR(20000),3500) AS Notes1
                       ,SUBSTRING(CAST(Notes AS VARCHAR(20000),3501,3500) AS Notes2
                       ...
                       ,SUBSTRING(CAST(Notes AS VARCHAR(20000),14004,3500) AS Notes5 
                       FROM remote_view')

我的鏈接服務器和Openquery遇到相同的問題。 我喜歡在這里加上2美分,因為與上述解決方案相比,解決方案幾乎沒有什么不同,並且很容易。 采用固定長度的字符串的原因是因為這是在ODBC驅動程序中設置的方式。 轉到ODBC驅動程序的“高級”選項,然后將顯示字符串長度的文本框更新為8000或更多以解決問題。 希望這可以幫助。 謝謝!

我的問題是公司名稱中的撇號。 我正在通過鏈接服務器使用openquery到postgres 9.1,但數據長度不匹配。 一旦我將其轉換為varchar 1000,它就通過了。

從OpenQuery(CMS,選擇*,選擇經銷商,

公司:: varchar(1000)

,代理,載體,add1,城市,州,郵編,電話,出租車(來自m1')作為GCP)

我有確切的問題。 如果您的文本數據長度不超過Postgresql的字符變化大小限制 (10485760),我發現了一種解決方法。 第一步,只需將以下屏幕截圖更改為Postgresql ODBC MaxLongVarchar設置為10485760。

PostgreSQL ODBC設置

之后,您有三個選擇:

  • 如果可能,您可以在PostgreSql Server上將文本數據字段更改為字符變化(10485760)。 以下語法將正常工作。

     SELECT * FROM LINKEDSERVER.dbname.schemaname.tablename 
  • 如果您不能更改原始表,則可以在postgresql上創建一個視圖,該視圖會將所有文本字段轉換為originaltextfield :: varchar(10485760),然后從postgresql視圖中選擇而不是表

     SELECT * FROM LINKEDSERVER.dbname.schemaname.viewname 
  • 您可以按以下方式使用OPENQUERY

    SELECT * FROM OPENQUERY(LINKEDSERVER,'SELECT id,textfield :: varchar(10485760)FROM schemaname.tablename')

您差不多完成了:

SELECT * FROM OPENQUERY(MYDB,'SELECT notes :: varchar(10000) from remote_view LIMIT 50');

返回的數據長度為9088,因此您的緩沖區應該足夠大!

VARCHAR(max)只能存儲8000,請嘗試使用TEXT數據類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM