T-SQL BULK INSERT टाइप मिसमैच

Oct 15 2020

मैं एक बड़े CSV फ़ाइल से एक टेबल पर एक साधारण BULK INSERT करने की कोशिश कर रहा हूं। तालिका और फ़ाइल में मेल खाते कॉलम हैं। यह मेरा कोड है:

BULK INSERT myTable
FROM 'G:\Tests\mySource.csv'
WITH (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    -- ROWTERMINATOR = '0x0a',
    BATCHSIZE = 1000,
    MAXERRORS = 2
)
GO

आप देख सकते हैं मैं पंक्ति टर्मिनेटर्स साथ की कोशिश की है \nऔर 0x0a(और एक गुच्छा अधिक)

मुझे एक प्रकार की बेमेल त्रुटि मिलती रहती है:

Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 18 (createdAt).
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 3, column 18 (createdAt).
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 4, column 18 (createdAt).
Msg 4865, Level 16, State 1, Line 1
Cannot bulk load because the maximum number of errors (2) was exceeded.
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

स्तंभ createdAtप्रकार का है datetime:

CREATE TABLE [dbo].[myTable]
(
    ...
    [createdAt] [datetime] NULL,
    ...
)

ये createdAtकॉलम के मान हैं जो पहली तीन पंक्तियों से लिए गए हैं:

2020-08-22 13:51:57
2020-08-22 14:13:13
2020-08-22 14:16:23

मैंने सुझाव के अनुसार एक अलग संख्या प्रारूप के साथ भी प्रयास किया। मैंने कॉलम प्रकार को भी बदलने की कोशिश की DATETIME2(n):

2020-08-22T13:51:57
2020-08-22T14:13:13
2020-08-22T14:16:23

मुझे नहीं पता कि समीक्षा करने के लिए और क्या है।

किसी भी सहायता के लिए धन्यवाद।

धन्यवाद!

जवाब

2 marc_s Oct 15 2020 at 16:47

SQL सर्वर द्वारा समर्थित दिनांक और समय में परिवर्तित होने के लिए स्ट्रिंग शाब्दिकों के कई प्रारूप हैं - CAST और CONSTT पर MSDN पुस्तकें ऑनलाइन देखें । उन प्रारूपों में से अधिकांश इस बात पर निर्भर हैं कि आपके पास क्या सेटिंग्स हैं - इसलिए, ये सेटिंग्स कुछ समय काम कर सकती हैं - और कभी-कभी नहीं। और DATETIMEविशेष रूप से डेटाटाइप बहुत ही अशुभ रूप से अचार के बारे में है कि स्ट्रिंग शाब्दिक के कौन से प्रारूप काम करते हैं - और कौन से अन्य (सबसे अधिक) नहीं .... DATETIME2(n)और अधिक क्षमा करने और कम अचार से निपटने के लिए!

इसे हल करने का तरीका (थोड़ा अनुकूलित) ISO-8601 दिनांक स्वरूप का उपयोग करना है जो SQL सर्वर द्वारा समर्थित है - यह प्रारूप हमेशा काम करता है - आपकी SQL सर्वर भाषा और डेटफ़ॉर्मेट सेटिंग्स की परवाह किए बिना।

आईएसओ 8601 प्रारूप एसक्यूएल सर्वर द्वारा समर्थित है दो रूपों में आता है:

  • YYYYMMDDसिर्फ तारीखों के लिए (कोई समय भाग नहीं); यहाँ ध्यान दें: कोई डैश! , यह बहुत महत्वपूर्ण है! YYYY-MM-DDहै नहीं अपने एसक्यूएल सर्वर में DateFormat सेटिंग्स के स्वतंत्र और होगा नहीं सभी परिस्थितियों में काम करते हैं!

या:

  • YYYY-MM-DDTHH:MM:SSदिनांक और समय के लिए - यहां ध्यान दें: इस प्रारूप में डैश हैं (लेकिन उन्हें छोड़ा जा सकता है), और Tआपके दिनांक और समय के भाग के बीच परिसीमन के रूप में एक निश्चित DATETIME।

यह SQL Server 2000 और नए के लिए मान्य है।

यदि आप SQL Server 2008 या नए और DATEडेटाटाइप (केवल DATE- नहीं DATETIME !) का उपयोग करते हैं, तो आप वास्तव में YYYY-MM-DDप्रारूप का उपयोग कर सकते हैं और यह भी, आपके SQL सर्वर में किसी भी सेटिंग्स के साथ काम करेगा।

मुझसे मत पूछिए कि यह पूरा विषय इतना पेचीदा और कुछ हद तक भ्रमित करने वाला क्यों है - बस यही तरीका है। लेकिन YYYYMMDDप्रारूप के साथ , आपको SQL सर्वर के किसी भी संस्करण के लिए ठीक होना चाहिए और अपने SQL सर्वर में किसी भी भाषा और दिनांक-निर्धारण सेटिंग के लिए।

SQL सर्वर 2008 और नए के लिए अनुशंसा है कि DATEयदि आपको केवल दिनांक भाग की आवश्यकता है, और DATETIME2(n)जब आपको दिनांक और समय दोनों की आवश्यकता हो , तो इसका उपयोग करें । DATETIMEयदि संभव हो तो आप डेटाटाइप को चरणबद्ध करने का प्रयास करना चाहिए

आपके मामले में, मैं एक दो चीजों की कोशिश करूंगा:

  • यदि आप कर सकते हैं - अपने कॉलम के डेटाटाइप DATETIME2(n)के DATETIMEरूप में उपयोग करें - जो अकेले आपकी सभी समस्याओं को हल कर सकता है

  • यदि आप उपयोग नहीं कर सकते DATETIME2(n)- CSV आयात फ़ाइल में अपनी तिथि और समय निर्दिष्ट करने के 2020-08-22T13:51:57बजाय उपयोग करने का प्रयास 2020-08-22 13:51:57करें।