sql server - SQL सर्वर तालिका के लिए INSERT कथन स्वचालित रूप से उत्पन्न करने का सबसे अच्छा तरीका क्या है?




sql-server code-generation (13)

हम एक नया आवेदन लिख रहे हैं, और परीक्षण करते समय, हमें डमी डेटा का एक गुच्छा की आवश्यकता होगी। मैंने प्रासंगिक तालिका में एक्सेल फ़ाइलों को डंप करने के लिए एमएस एक्सेस का उपयोग कर डेटा जोड़ा है।

हर बार, हम प्रासंगिक तालिकाओं को "रीफ्रेश" करना चाहते हैं, जिसका अर्थ है कि उन्हें सभी को छोड़ना, उन्हें फिर से बनाना, और सहेजी गई एमएस एक्सेस एपेंड क्वेरी चलाना।

पहला भाग (ड्रॉप और री-बिल्डिंग) एक आसान एसक्यूएल स्क्रिप्ट है, लेकिन आखिरी हिस्सा मुझे क्रिंग करता है। मैं एक एकल सेटअप स्क्रिप्ट चाहता हूं जिसमें डमी डेटा को पुन: उत्पन्न करने के लिए INSERT का एक समूह हो।

मेरे पास अब टेबल में डेटा है। उस डेटासेट से INSERT कथन की एक बड़ी सूची स्वचालित रूप से उत्पन्न करने का सबसे अच्छा तरीका क्या है?

मैं TOAD (ओरेकल के लिए) जैसे कुछ के बारे में सोच रहा हूं, जहां आप ग्रिड पर राइट-क्लिक कर सकते हैं और सेव करें-> स्टेटमेंट सम्मिलित करें पर क्लिक करें, और जहां भी आप चाहें वहां एक बड़ी एसक्यूएल स्क्रिप्ट डंप करेंगे।

ऐसा करने का एकमात्र तरीका यह है कि मैं टेबल को एक्सेल शीट में सहेजना चाहता हूं और फिर प्रत्येक पंक्ति के लिए INSERT बनाने के लिए एक्सेल फॉर्मूला लिखना चाहता हूं, जो निश्चित रूप से सबसे अच्छा तरीका नहीं है।

मैं SQL सर्वर 2005 डेटाबेस से कनेक्ट करने के लिए 2008 प्रबंधन स्टूडियो का उपयोग कर रहा हूं।


Sp_generate_inserts का पहला लिंक बहुत अच्छा है, यहां एक बहुत ही सरल संस्करण है:

DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep []
DECLARE @Table  VARCHAR(max); SET @Table  = 'Queues'               -- your table

DECLARE @SQL    VARCHAR(max)
SET @SQL = 'DECLARE @S VARCHAR(MAX)
SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + 
 ''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + '
PRINT @S'

EXEC (@SQL)

मेरे सिस्टम पर, मुझे यह परिणाम मिलता है:

INSERT INTO Queues([QueueName], [iSort])
SELECT 'WD: Auto Capture', '10' UNION 
SELECT 'Car/Lar', '11' UNION 
SELECT 'Scan Line', '21' UNION 
SELECT 'OCR', '22' UNION 
SELECT 'Dynamic Template', '23' UNION 
SELECT 'Fix MICR', '41' UNION 
SELECT 'Fix MICR (Supervisor)', '42' UNION 
SELECT 'Foreign MICR', '43' UNION 
...

अपने काम से पहले डेटा का बैकअप क्यों न लें, फिर जब आप इसे रीफ्रेश करना चाहते हैं तो पुनर्स्थापित करें?

यदि आपको आवेषण उत्पन्न करना होगा तो प्रयास करें: http://vyaskn.tripod.com/code.htm#inserts


आवेषण का उपयोग न करें, BCP उपयोग करें


क्या आपके पास अभी तक उत्पादन डेटाबेस में डेटा है? यदि ऐसा है, तो आप डेटा को डीटीएस के माध्यम से डेटा रीफ्रेश कर सकते हैं। हम सप्ताहांत पर साप्ताहिक करते हैं और हमारे परीक्षण के लिए हर सप्ताह स्वच्छ, वास्तविक डेटा रखना बहुत अच्छा होता है।

यदि आपके पास अभी तक उत्पादन नहीं है, तो आपको एक डेटाबेस बनाना चाहिए जो वे चाहते हैं कि आप इसे (ताजा) चाहते हैं। फिर, डेटाबेस को डुप्लिकेट करें और अपने परीक्षण वातावरण के रूप में उस नव निर्मित डेटाबेस का उपयोग करें। जब आप स्वच्छ संस्करण चाहते हैं, तो बस अपने साफ एक को फिर से डुबोएं और बॉब के अपने चाचा को दोहराएं


जैसा कि @ माइक रिटाको द्वारा उल्लेख किया गया है लेकिन एसएसएमएस 2008 आर 2 के लिए अपडेट किया गया है

  1. डेटाबेस नाम पर राइट क्लिक करें
  2. कार्य> स्क्रिप्ट जेनरेट करें चुनें
  3. आपकी सेटिंग्स के आधार पर परिचय पृष्ठ दिखाया जा सकता है या नहीं
  4. 'विशिष्ट डेटाबेस ऑब्जेक्ट्स का चयन करें' चुनें,
  5. पेड़ दृश्य का विस्तार करें और प्रासंगिक तालिकाओं की जांच करें
  6. अगला पर क्लिक करें
  7. उन्नत क्लिक करें
  8. सामान्य अनुभाग के तहत, 'डेटा के प्रकार के प्रकार' के लिए उपयुक्त विकल्प चुनें
  9. जादूगर को पूरा करें

फिर आप एसएसएमएस से सीधे डेटा के लिए सभी INSERT कथन प्राप्त करेंगे।

2016-10-25 संपादित करें एसक्यूएल सर्वर 2016 / एसएसएमएस 13.0.15900.1

  1. डेटाबेस नाम पर राइट क्लिक करें

  2. कार्य> स्क्रिप्ट जेनरेट करें चुनें

  3. आपकी सेटिंग्स के आधार पर परिचय पृष्ठ दिखाया जा सकता है या नहीं

  4. 'विशिष्ट डेटाबेस ऑब्जेक्ट्स का चयन करें' चुनें,

  5. पेड़ दृश्य का विस्तार करें और प्रासंगिक तालिकाओं की जांच करें

  6. अगला पर क्लिक करें

  7. उन्नत क्लिक करें

  8. सामान्य अनुभाग के तहत, 'डेटा के प्रकार के प्रकार' के लिए उपयुक्त विकल्प चुनें

  9. ओके पर क्लिक करें

  10. चुनें कि क्या आप आउटपुट को एक नई क्वेरी, क्लिपबोर्ड या फ़ाइल पर जाना चाहते हैं

  11. दो बार अगला क्लिक करें

  12. आपकी स्क्रिप्ट आपके द्वारा उठाई गई सेटिंग्स के अनुसार तैयार की जाती है

  13. समाप्त क्लिक करें


निश्चित नहीं है, अगर मैं आपके प्रश्न को सही ढंग से समझता हूं।

यदि आपके पास एमएस-एक्सेस में डेटा है, जिसे आप इसे SQL सर्वर पर ले जाना चाहते हैं - तो आप डीटीएस का उपयोग कर सकते हैं।
और, मुझे लगता है कि आप सभी आईएनएसईआरटी बयान देखकर एसक्यूएल प्रोफाइलर का उपयोग कर सकते हैं, मुझे लगता है।


मैं एसएसएमएस 2008 संस्करण 10.0.5500.0 का उपयोग कर रहा हूँ। जेनरेट स्क्रिप्ट विज़ार्ड के हिस्से के रूप में इस संस्करण में, उन्नत बटन की बजाय, नीचे दी गई स्क्रीन है। इस मामले में, मैं सिर्फ डेटा डालना चाहता था और कोई बयान नहीं देता था, इसलिए मुझे दो घेरे वाले गुणों को बदलना पड़ा


मैं ऐसा करने के लिए स्क्लाइट का उपयोग करता हूं। मुझे स्क्रैच / टेस्ट डेटाबेस बनाने के लिए बहुत उपयोगी लगता है।

sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql


मैंने इस पर बहुत कुछ शोध किया है, लेकिन मुझे इसके लिए ठोस समाधान नहीं मिला। वर्तमान में जो दृष्टिकोण मैं अनुसरण करता हूं वह SQL सर्वर प्रबंधन स्टूडियो से एक्सेल में सामग्री की प्रतिलिपि बनाता है और फिर डेटा को ओरेकल-TOAD में आयात करता है और फिर सम्मिलित विवरण उत्पन्न करता है


यदि आपको प्रोग्रामेटिक एक्सेस की आवश्यकता है, तो आप ओपन सोर्स संग्रहीत प्रक्रिया 'जेनरेट इन्सर्ट' का उपयोग कर सकते हैं।

INSERT कथन जनरेटर

एक सरल और त्वरित उदाहरण के रूप में, एक तालिका के लिए INSERT कथन उत्पन्न करने के लिए AdventureWorks.Person.AddressType निम्नलिखित कथन निष्पादित करें:

USE [AdventureWorks];
GO
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType';

यह निम्न स्क्रिप्ट उत्पन्न करेगा:

SET NOCOUNT ON
SET IDENTITY_INSERT Person.AddressType ON
INSERT INTO Person.AddressType
([AddressTypeID],[Name],[rowguid],[ModifiedDate])
VALUES
 (1,N'Billing','B84F78B1-4EFE-4A0E-8CB7-70E9F112F886',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(2,N'Home','41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(3,N'Main Office','8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(4,N'Primary','24CB3088-4345-47C4-86C5-17B535133D1E',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(5,N'Shipping','B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(6,N'Archive','A67F238A-5BA2-444B-966C-0467ED9C427F',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
SET IDENTITY_INSERT Person.AddressType OFF


समस्या में मेरा योगदान, एक पावरहेल INSERT स्क्रिप्ट जेनरेटर जो आपको बोझिल एसएसएमएस जीयूआई का उपयोग किए बिना एकाधिक टेबल स्क्रिप्ट करने देता है। स्रोत नियंत्रण में तेजी से "बीज" डेटा के लिए बढ़िया है।

  1. नीचे दी गई स्क्रिप्ट को "filename.ps1" के रूप में सहेजें।
  2. "मुझे अनुकूलित करें" के तहत क्षेत्रों में अपना स्वयं का संशोधन करें।
  3. आप किसी भी क्रम में स्क्रिप्ट में टेबल की सूची जोड़ सकते हैं।
  4. आप पावरहेल आईएसई में स्क्रिप्ट खोल सकते हैं और Play बटन दबा सकते हैं, या पावरहेल कमांड प्रॉम्प्ट में स्क्रिप्ट को निष्पादित कर सकते हैं।

डिफ़ॉल्ट रूप से, उत्पन्न आईएनएसईआरटी स्क्रिप्ट स्क्रिप्ट के समान फ़ोल्डर के तहत "SeedData.sql" होगी।

आपको SQL सर्वर प्रबंधन ऑब्जेक्ट असेंबली स्थापित करने की आवश्यकता होगी, यदि आपके पास SSMS इंस्टॉल है तो वहां होना चाहिए।

Add-Type -AssemblyName ("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
Add-Type -AssemblyName ("Microsoft.SqlServer.ConnectionInfo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")



#CUSTOMIZE ME
$outputFile = ".\SeedData.sql"
$connectionString = "Data Source=.;Initial Catalog=mydb;Integrated Security=True;"



$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn)
$db = $srv.Databases[$srv.ConnectionContext.DatabaseName]
$scr = New-Object Microsoft.SqlServer.Management.Smo.Scripter $srv
$scr.Options.FileName = $outputFile
$scr.Options.AppendToFile = $false
$scr.Options.ScriptSchema = $false
$scr.Options.ScriptData = $true
$scr.Options.NoCommandTerminator = $true

$tables = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection



#CUSTOMIZE ME
$tables.Add($db.Tables["Category"].Urn)
$tables.Add($db.Tables["Product"].Urn)
$tables.Add($db.Tables["Vendor"].Urn)



[void]$scr.EnumScript($tables)

$sqlConnection.Close()

GenerateData लिए एक अद्भुत उपकरण है। इसमें बदलाव करना भी बहुत आसान है क्योंकि स्रोत कोड आपके लिए उपलब्ध है। कुछ अच्छी विशेषताएं:

  • लोगों के नाम और स्थानों के लिए नाम जनरेटर
  • जेनरेशन प्रोफाइल को सहेजने की क्षमता (इसे डाउनलोड करने और स्थानीय रूप से स्थापित करने के बाद)
  • स्क्रिप्ट के माध्यम से पीढ़ी को अनुकूलित और कुशल बनाने की क्षमता
  • डेटा के लिए कई अलग-अलग आउटपुट (सीएसवी, जावास्क्रिप्ट, जेएसओएन, आदि) (यदि आपको विभिन्न वातावरण में सेट का परीक्षण करने की आवश्यकता है और डेटाबेस पहुंच को छोड़ना चाहते हैं)
  • मुफ्त लेकिन अगर आपको सॉफ़्टवेयर उपयोगी लगता है तो दान करने पर विचार करें :)।






code-generation