เรียกใช้ไฟล์ SQL ทั้งหมดในไดเร็กทอรี


117

ฉันมีไฟล์. sql จำนวนหนึ่งซึ่งฉันต้องเรียกใช้เพื่อใช้การเปลี่ยนแปลงที่ทำโดยนักพัฒนารายอื่นบนฐานข้อมูล SQL Server 2005 ไฟล์ถูกตั้งชื่อตามรูปแบบต่อไปนี้:

0001 - abc.sql
0002 - abcef.sql
0003 - abc.sql
...

มีวิธีเรียกใช้ทั้งหมดในครั้งเดียวหรือไม่?

คำตอบ:


143

สร้างไฟล์. BAT ด้วยคำสั่งต่อไปนี้:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -E -i"%%G"
pause

หากคุณต้องการระบุชื่อผู้ใช้และรหัสผ่าน

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P 
password -i"%%G"

โปรดทราบว่าไม่จำเป็นต้องใช้ "-E" เมื่อระบุผู้ใช้ / รหัสผ่าน

วางไฟล์. BAT นี้ในไดเร็กทอรีที่คุณต้องการให้ไฟล์. SQL ถูกเรียกใช้งานดับเบิลคลิกที่ไฟล์. BAT เท่านี้ก็เสร็จสิ้น!


2
เมื่อฉันเรียกใช้ไฟล์แบตช์ปัญหาการตรวจสอบสิทธิ์บางอย่างเกิดขึ้นว่า "การเข้าสู่ระบบล้มเหลวการเข้าสู่ระบบมาจากโดเมนที่ไม่น่าเชื่อถือและไม่สามารถใช้กับการรับรองความถูกต้องของ Windows ได้" มีวิธีการระบุชื่อผู้ใช้และรหัสผ่านเช่นชื่อเซิร์ฟเวอร์และฐานข้อมูลหรือไม่?
Sanjay Maharjan

11
@SanjayMaharjan ใช้ -U สำหรับผู้ใช้และ -P สำหรับรหัสผ่านเช่น:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb

ฉันจะใส่เอาท์พุตเพื่อแยกไฟล์โดยใช้ -o ได้อย่างไร เมื่อใดก็ตามที่ฉันใช้เช่น -o temp.txt temp.txt นี้จะถูกเขียนทับ ฉันต้องการรับไฟล์เอาต์พุตเป็นชื่อไฟล์ sql เดียวกัน
kevin

@vijeth: คนทำงานดี. ฉันคิดว่าจะทำทีละไฟล์ 200 sql ประหยัดเวลาได้มาก
Uthistran Selvaraj

@Vijeth ขอบคุณครับ. ฉันแค่แก้ไขเพื่อตัวเอง: สภาพแวดล้อมการพัฒนา REM REM เท่านั้น !! REM หยุดชั่วคราวสำหรับ %% G ใน (* .sql) ทำ sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" หยุดชั่วคราว REM REM สคริปต์ทั้งหมด Run Successfully REM
atik sarker

71

ใช้สำหรับ . จากพรอมต์คำสั่ง:

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"

2
ฉันต้องใส่เครื่องหมายคำพูดรอบ ๆ "% f" สุดท้ายเพื่อให้ใช้งานได้กับสคริปต์ที่มีช่องว่าง
Steve Wright

สำหรับเวอร์ชันที่ทำงานในไฟล์แบตช์โปรดดูคำตอบนี้
Ian Kemp

ฉันต้องเพิ่มพารามิเตอร์อื่น ๆ ด้วย (เช่น / ฉันเพื่อเปิดใช้งานตัวระบุที่ยกมา)
Pavel K

ฉันชอบอันนี้ - แต่มีวิธีใดบ้างที่จะส่งผลลัพธ์ไปยังไฟล์? ฉันจึงสามารถเห็นข้อยกเว้นใด ๆ ได้อย่างง่ายดาย? ฉันเพิ่งลองใช้คำสั่งนี้กับไฟล์ 136 .sql ดังนั้นฉันจึงสูญเสียการมองเห็นของพวกเขาส่วนใหญ่
Rich

2
@Rich หากต้องการเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ให้ใช้คำสั่งนี้: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการเปลี่ยนเส้นทางเอาต์พุตได้ที่นี่
danijelk

26
  1. ใน SQL Management Studio เปิดแบบสอบถามใหม่และพิมพ์ไฟล์ทั้งหมดตามด้านล่าง

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. ไปที่เมนู Query บน SQL Management Studio และตรวจสอบให้แน่ใจว่าเปิดใช้งานโหมด SQLCMD แล้ว
  3. คลิกที่โหมด SQLCMD; ไฟล์จะถูกเลือกเป็นสีเทาด้านล่าง

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. ตอนนี้ดำเนินการ

3
นี่เป็นเรื่องที่น่าเบื่อมากถ้าฉันมีไฟล์หลายร้อยไฟล์
devlin carnate

1
@devlincarnate: สมมติว่าคุณสามารถหาวิธีทำให้ขั้นตอนที่ 1 อัตโนมัติได้เช่น "dir / B * .sql> list.txt" แล้วนวดไฟล์ list.txt นั้นเล็กน้อย
Jeff Roe

@devlincarnate ใน Windows เวอร์ชันใหม่กว่าคุณสามารถกดปุ่ม Shift ค้างไว้คลิกขวาที่ไฟล์แล้วเลือก "คัดลอกเป็นเส้นทาง" จากนั้น CTRL + V ในหน้าต่าง SSMS ใช้งานได้กับไฟล์หลายไฟล์ด้วย เลือกไฟล์สองไฟล์ขึ้นไปใน Explorer คลิกขวาที่ไฟล์ใด ๆ ที่ไฮไลต์แล้วเลือก "คัดลอกเป็นเส้นทาง" ทำซ้ำขั้นตอนใน SSMS เส้นทางไฟล์จะอยู่ในเครื่องหมายอัญประกาศคู่ซึ่งคุณอาจต้องการหรือไม่ต้องการตัดออกใน SSMS ด้วย Find / Replace
Dave Mason

21

ตรวจสอบให้แน่ใจว่าคุณเปิดใช้งาน SQLCMD โดยคลิกที่ตัวเลือกโหมด Query> SQLCMD ในสตูดิโอการจัดการ

  1. สมมติว่าคุณมีสี่ไฟล์ .sql ( script1.sql,script2.sql,script3.sql,script4.sql) c:\scriptsในโฟลเดอร์

  2. สร้างไฟล์สคริปต์หลัก (Main.sql) ดังต่อไปนี้:

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    :r c:\Scripts\script4.sql

    บันทึก Main.sql ใน c: \ scripts เอง

  3. สร้างไฟล์แบตช์ที่ExecuteScripts.batมีชื่อดังต่อไปนี้:

    SQLCMD -E -d<YourDatabaseName> -ic:\Scripts\Main.sql
    PAUSE

    อย่าลืมแทนที่<YourDatabaseName>ด้วยฐานข้อมูลที่คุณต้องการเรียกใช้สคริปต์ของคุณ ตัวอย่างเช่นหากฐานข้อมูลเป็น "พนักงาน" คำสั่งจะเป็นดังนี้:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. เรียกใช้ไฟล์แบตช์โดยดับเบิลคลิกที่ไฟล์เดียวกัน


ฉันเพิ่งแก้ไขคำตอบของฉัน นอกจากนี้เราต้องตรวจสอบให้แน่ใจว่าไฟล์สคริปต์มีอยู่ในพา ธ ที่ระบุ
Ashish Gupta

สิ่งที่ดีเกี่ยวกับแนวทางนี้คือพบข้อผิดพลาดใด ๆ จากนั้นให้หยุดเรียกใช้สคริปต์เพิ่มเติม :) คล้ายกับ-bตัวอย่าง:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider

และสิ่งที่ไม่ดีเกี่ยวกับแนวทางนี้ที่เราต้องรักษารายการไฟล์ SQL ทั้งหมดเพื่อให้ทำงานได้
Francisco d'Anconia

10

คุณสามารถใช้ ApexSQL การเผยแพร่ เป็นเครื่องมือฟรีที่ดำเนินการหลายสคริปต์ในหลายฐานข้อมูล คุณสามารถเลือกสคริปต์ได้มากเท่าที่คุณต้องการและดำเนินการกับฐานข้อมูลเดียวหรือหลายฐานข้อมูล (แม้แต่หลายเซิร์ฟเวอร์) คุณสามารถสร้างรายการสคริปต์และบันทึกจากนั้นเลือกรายการนั้นทุกครั้งที่คุณต้องการเรียกใช้สคริปต์เดียวกันเหล่านั้นตามลำดับที่สร้างขึ้น (สามารถเพิ่มรายการสคริปต์หลายรายการได้ด้วย):

เลือกสคริปต์

เมื่อสคริปต์และฐานข้อมูลถูกเลือกจะแสดงในหน้าต่างหลักและสิ่งที่คุณต้องทำคือคลิกปุ่ม“ ดำเนินการ” จากนั้นสคริปต์ทั้งหมดจะถูกเรียกใช้บนฐานข้อมูลที่เลือกตามลำดับที่กำหนด:

การดำเนินการสคริปต์


8

แบบสอบถามทั่วไป

บันทึกบรรทัดด้านล่างใน notepad ด้วยชื่อbatch.bat และวางไว้ในโฟลเดอร์ที่มีไฟล์สคริปต์ทั้งหมดของคุณอยู่

 for %%G in (*.sql) do sqlcmd /S servername /d databasename  -i"%%G"
    pause

ตัวอย่าง

สำหรับ %% G ใน (* .sql) ทำ sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" หยุดชั่วคราว

บางครั้งหากการเข้าสู่ระบบล้มเหลวสำหรับคุณโปรดใช้รหัสด้านล่างพร้อมชื่อผู้ใช้และรหัสผ่าน

for %%G in (*.sql) do sqlcmd /S SERVERNAME /d DBNAME -U USERNAME -P PASSWORD -i"%%G"
pause

สำหรับ %% G ใน (* .sql) ทำ sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P tiger -i "%% G" หยุดชั่วคราว

หลังจากที่คุณสร้างไฟล์ bat ภายในโฟลเดอร์ที่มีไฟล์ Script ของคุณอยู่แล้วเพียงแค่คลิกที่ไฟล์ bat สคริปต์ของคุณก็จะถูกเรียกใช้งาน


5

ฉันเขียนยูทิลิตี้โอเพนซอร์สใน C # ที่ให้คุณลากและวางไฟล์ SQL จำนวนมากและเริ่มรันกับฐานข้อมูล

ยูทิลิตี้นี้มีคุณสมบัติดังต่อไปนี้:

  • ลากและวางไฟล์สคริปต์
  • รันไดเร็กทอรีของไฟล์สคริปต์
  • Sql Script out ส่งข้อความระหว่างการดำเนินการ
  • สคริปต์ผ่านหรือล้มเหลวที่มีสีเขียวและแดง (สีเหลืองสำหรับการทำงาน)
  • หยุดตัวเลือกข้อผิดพลาด
  • เปิดสคริปต์บนตัวเลือกข้อผิดพลาด
  • เรียกใช้รายงานพร้อมเวลาที่ใช้สำหรับแต่ละสคริปต์
  • ระยะเวลารวม
  • ทดสอบการเชื่อมต่อฐานข้อมูล
  • Asynchronus
  • .Net 4 และทดสอบด้วย SQL 2008
  • ไฟล์ exe เดียว
  • ฆ่าการเชื่อมต่อได้ตลอดเวลา

4

วิธีที่ง่ายที่สุดที่ฉันพบมีขั้นตอนต่อไปนี้ (ข้อกำหนดเดียวคือต้องอยู่ใน Win7 +):

  • เปิดโฟลเดอร์ใน Explorer
  • เลือกไฟล์สคริปต์ทั้งหมด
  • กด Shift
  • คลิกขวาที่ส่วนที่เลือกแล้วเลือก "คัดลอกเป็นเส้นทาง"
  • ไปที่ SQL Server Management Studio
  • สร้างแบบสอบถามใหม่
  • เมนูแบบสอบถาม "โหมด SQLCMD"
  • วางรายการตามด้วย Ctrl + H แทนที่ '"C: \' (หรืออักษรชื่อไดรฟ์อะไรก็ได้) ด้วย ': r" C:' (เช่นนำหน้าบรรทัดด้วย ': r')
  • เรียกใช้แบบสอบถาม

ฟังดูยาว แต่ในความเป็นจริงเร็วมาก .. (ฟังดูนานเหมือนกันนะที่อธิบายแม้แต่ขั้นตอนที่เล็กที่สุด)


2

สิ่งที่ฉันรู้คุณสามารถใช้คำสั่ง osql หรือ sqlcmd เพื่อเรียกใช้ไฟล์ sql หลายไฟล์ ข้อเสียคือคุณจะต้องสร้างสคริปต์สำหรับทั้งคำสั่ง

การใช้ SQLCMD เพื่อเรียกใช้สคริปต์ SQL Server หลายตัว

OSQL (สำหรับ sql server 2000)

http://msdn.microsoft.com/en-us/library/aa213087(v=SQL.80).aspx


1
@echo off
cd C:\Program Files (x86)\MySQL\MySQL Workbench 6.0 CE

for %%a in (D:\abc\*.sql) do (
echo %%a
mysql --host=ip --port=3306 --user=uid--password=ped < %%a
)

ขั้นตอนที่ 1: คัดลอกบรรทัดด้านบนลงในแผ่นบันทึกบันทึกเป็นค้างคาว

ขั้นตอนที่ 2: ในโฟลเดอร์ d drive abc ในไฟล์ Sql ทั้งหมดในแบบสอบถามที่ดำเนินการในเซิร์ฟเวอร์ sql

ขั้นตอนที่ 3: ระบุไอพีรหัสผู้ใช้และรหัสผ่านของคุณ


คำถามนี้เกี่ยวข้องกับ MSSQL ไม่ใช่ MySQL
Shawn

0

คุณสามารถสร้างสคริปต์เดียวที่เรียกคนอื่น ๆ ทั้งหมด

ใส่สิ่งต่อไปนี้ลงในไฟล์แบตช์:

@echo off
echo.>"%~dp0all.sql"
for %%i in ("%~dp0"*.sql) do echo @"%%~fi" >> "%~dp0all.sql"

เมื่อคุณเรียกใช้ไฟล์แบตช์นั้นไฟล์จะสร้างสคริปต์ใหม่ที่มีชื่อall.sqlในไดเร็กทอรีเดียวกันกับที่ตั้งไฟล์แบตช์ มันจะค้นหาไฟล์ทั้งหมดที่มีนามสกุล.sqlในไดเร็กทอรีเดียวกับที่มีไฟล์แบตช์อยู่

จากนั้นคุณสามารถรันสคริปต์ทั้งหมดโดยใช้sqlplus user/pwd @all.sql(หรือขยายไฟล์แบตช์เพื่อเรียกใช้sqlplusหลังจากสร้างall.sqlสคริปต์)


0

สำหรับการเรียกใช้ SQLfile ทุกไฟล์บนไดเร็กทอรีเดียวกันให้ใช้คำสั่งต่อไปนี้:

ls | awk '{print "@"$0}' > all.sql

คำสั่งนี้จะสร้างไฟล์ SQL ไฟล์เดียวที่มีชื่อของไฟล์ SQL ทุกไฟล์ในไดเร็กทอรีต่อท้ายด้วย "@"

หลังจากall.sqlสร้างเสร็จแล้วให้ดำเนินการall.sqlกับ SQLPlus สิ่งนี้จะเรียกใช้ไฟล์ sql ทุกไฟล์ในไฟล์all.sql.


0

หากคุณสามารถใช้ Interactive SQL:

1 - สร้างไฟล์. BAT ด้วยรหัสนี้:

@ECHO OFF ECHO
for %%G in (*.sql) do dbisql -c "uid=dba;pwd=XXXXXXXX;ServerName=INSERT-DB-NAME-HERE" %%G
pause

2 - เปลี่ยน pwd และ ServerName

3 - ใส่ไฟล์. BAT ในโฟลเดอร์ที่มีไฟล์. SQL และเรียกใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.