วิธีตรวจสอบว่ามีขั้นตอนการจัดเก็บอยู่ก่อนสร้าง


283

ฉันมีสคริปต์ SQL ที่ต้องรันทุกครั้งที่ไคลเอ็นต์เรียกใช้งานฟังก์ชัน "การจัดการฐานข้อมูล" สคริปต์รวมถึงการสร้างกระบวนงานที่เก็บไว้ในฐานข้อมูลลูกค้า ไคลเอนต์เหล่านี้บางส่วนอาจมีกระบวนงานที่เก็บไว้เมื่อเรียกใช้สคริปต์และบางอย่างอาจไม่ ฉันต้องมีขั้นตอนการจัดเก็บที่ขาดหายไปเพิ่มไว้ในฐานข้อมูลลูกค้า แต่ไม่สำคัญว่าฉันพยายามงอไวยากรณ์ T-SQL มากแค่ไหน

CREATE / ALTER PROCEDURE 'ต้องเป็นคำสั่งแรกในชุดการสืบค้น

ฉันได้อ่านสิ่งนั้นก่อนที่จะสร้างผลงาน แต่ฉันไม่ชอบที่จะทำแบบนั้น

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...

ฉันจะเพิ่มการตรวจสอบการมีอยู่ของกระบวนงานที่เก็บไว้และสร้างมันได้อย่างไรถ้ามันไม่มีอยู่ แต่จะแก้ไขหากมีอยู่?


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

คุณหมายถึงขั้นตอน 'ที่ไม่ได้จัดเก็บ' ตัวอย่างทั้งหมดของคุณทำขั้นตอนการจัดเก็บใหม่ สิ่งนี้เกี่ยวข้องกับคำถามของคุณอย่างไร
AakashM

ตกลงเราไปกันแล้ว สิ่งนี้คือฉันมีสคริปต์ SQL ขนาดใหญ่ที่ลูกค้าจำนวนมากใช้และต้องทำงานอย่างละเอียดทุกครั้งที่ลูกค้าเรียกใช้ฟังก์ชัน "การจัดการฐานข้อมูล" ที่ซอฟต์แวร์ของเรามีให้ ดังนั้นไคลเอนต์เหล่านี้บางรายอาจมีโพรซีเดอร์เก็บไว้เมื่อรันสคริปต์และบางอันอาจไม่ ฉันรู้ว่านี่มันงี่เง่าฉันไม่จำเป็นต้องทำตามขั้นตอนนี้เพื่อไม่เก็บสต็อกฉันสามารถตรวจสอบว่ามันมีอยู่และสร้างมันถ้ามันไม่ อย่างไรก็ตามมันไม่สำคัญว่าฉันจะพยายามงอไวยากรณ์ T-SQL มากแค่ไหนมันมีข้อผิดพลาดอยู่เสมอ
Shaper

ทุกครั้งที่พวกเขาเรียกใช้สคริปต์มันจะพยายามสร้างโพรซีเดอร์อีกครั้ง (โชคไม่ดีมันทุกอย่างจะต้องมีสคริปต์ในไฟล์. sql เดียวกันรวมถึงการสร้างโพรซีเดอร์) หากไม่มีอยู่แล้ว CREATE จะไม่ทำงานเนื่องจากข้อ จำกัด ทางไวยากรณ์ ฉันจะทำอย่างไร
Shaper

3
สำเนาซ้ำซ้อนที่เป็นไปได้ของstackoverflow.com/questions/937908/ …
Michael Freidgeim

คำตอบ:


199

คุณสามารถเรียกใช้รหัสขั้นตอนได้ทุกที่ที่คุณสามารถเรียกใช้แบบสอบถาม

เพียงคัดลอกทุกอย่างหลังจากAS:

BEGIN
    DECLARE @myvar INT
    SELECT  *
    FROM    mytable
    WHERE   @myvar ...
END

รหัสนี้ทำในสิ่งเดียวกันกับที่ proc ที่เก็บไว้จะทำ แต่จะไม่ถูกจัดเก็บในด้านฐานข้อมูล

PL/SQLนั่นเป็นเหมือนสิ่งที่เรียกว่าขั้นตอนที่ไม่ระบุชื่อใน

ปรับปรุง:

ชื่อคำถามของคุณค่อนข้างสับสน

หากคุณต้องการสร้างโพรซีเดอร์หากไม่มีอยู่รหัสของคุณก็ใช้ได้

นี่คือSSMSผลลัพธ์ของการสร้างสคริปต์:

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'myproc')
                    AND type IN ( N'P', N'PC' ) ) 
DROP 
CREATE 

ปรับปรุง:

ตัวอย่างของวิธีการทำเมื่อรวมสกีมา:

IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[MyProc]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[MyProc]
END

ในตัวอย่างด้านบนdboคือสกีมา

ปรับปรุง:

ใน SQL Server 2016+ คุณสามารถทำได้

CREATE OR ALTER PROCEDURE dbo.MyProc


ใช่นี่เป็นความจริง แต่คุณจะสูญเสียฟังก์ชันการทำงานของขั้นตอนทั้งหมดเนื่องจากไม่มีขั้นตอน, udfs, มุมมองและสิ่งดังกล่าวจะถูกเก็บไว้เพื่อโทรจากภายในแบบสอบถาม (ขออภัยแก้ไขมันทำให้รู้สึกในหัวของฉัน X-))
Adriaan Stander

1
ใช่ แต่คุณสามารถเรียกขั้นตอนจากภายในขั้นตอนอื่น ๆ หรือใช้การส่งคืนเป็นอินพุตในตาราง
Adriaan Stander

@astander: คุณสามารถเรียกรหัสที่ไม่ระบุชื่อได้จากขั้นตอนการจัดเก็บเช่นกัน ในการใช้งานเอาต์พุตของพวกเขาINSERTคุณจะต้องใช้งานOPENROWSETหรือOPENQUERYทำงานร่วมกับรหัสที่ไม่ระบุตัวตนเช่นกัน แน่นอนว่ามีข้อเสียเปรียบในรหัสที่ไม่ระบุชื่อ: ตัวอย่างเช่นมันจะทำงานภายใต้สิทธิ์ของผู้โทร จุดของฉันคือว่ามันเป็นไปได้วิธีที่ไม่แนะนำในการทำสิ่ง :)
Quassnoi

"ถ้าคุณต้องการสร้างโพรซีเดอร์หากไม่มีอยู่รหัสของคุณก็ใช้ได้" และนั่นคือสิ่งที่ฉันอยากรู้ ฉันพยายามใช้ SSMS Create เป็นสคริปต์จริง แต่ก็ไม่ได้ดีอะไรเลย แต่ขอบคุณ Quassnoi และฉันขอโทษเกี่ยวกับคำถามที่ไม่ชัดเจน
The Shaper

2
คำสั่ง CREATE PROC ต้องเป็นคำสั่งเดียวในแบตช์เมื่อไม่ได้ใช้ SQL แบบไดนามิกดังนั้นคุณจึงไม่สามารถล้อมรอบธุรกรรม DROP / CREATE เมื่อนำมาใช้ในลักษณะนี้ จะต้องมี GO (ตัวคั่นแบทช์) หลังจากการเรียก DROP PROC
ชีฟ

449

ฉันรู้ว่านี่ถูกทำเครื่องหมายเป็นคำตอบแล้ว แต่เราเคยทำเช่นนี้:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('dbo.MyProc'))
   exec('CREATE PROCEDURE [dbo].[MyProc] AS BEGIN SET NOCOUNT ON; END')
GO

ALTER PROCEDURE [dbo].[MyProc] 
AS
  ....

เพียงเพื่อหลีกเลี่ยงการวางขั้นตอน


74
เพียงเพิ่มบางบันทึกเกี่ยวกับสาเหตุที่เป็นความคิดที่ดี: 1) การปล่อยจะลบการตั้งค่าความปลอดภัยใด ๆ 2) โดยการทำเช่นนี้หากสคริปต์การแก้ไขล้มเหลวด้วยเหตุผลบางอย่าง sp จะไม่ถูกทิ้ง
Ryan Guill

10
นี่คือคำตอบที่ถูกต้องอย่างแท้จริง มันหลีกเลี่ยงการสูญเสียเงินใด ๆ ใน proc ที่เก็บไว้ในคำถาม
Andy_Vulhop

7
มีประโยชน์อย่างมากกับวิธีนี้เมื่อไม่มีเวลาในการเก็บขั้นตอน สิ่งนี้อาจสำคัญหากการอัปเดตถูกนำไปใช้กับระบบที่สำคัญในขณะที่ยังคงมีการใช้งานโดยบุคคลระบบหรือเธรดอื่น การติดตามข้อผิดพลาดที่เกิดจากการทำโพรซีเดอร์ที่เก็บไว้ในชั่วขณะหนึ่งสามารถทำให้ค่อนข้างรำคาญเพราะมันยากที่จะทำซ้ำ
James

3
นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมด้วยเหตุผลหลายประการที่กล่าวถึงไปแล้วและฉันต้องการเพิ่มในกรณีที่ DBA ใช้ proc meta-data (เช่นวันที่สร้าง) สิ่งนี้จะทำให้สิ่งนั้นไม่เสียหายแทนที่จะทำให้ proc ใหม่ทุกครั้ง ฉันกำลังพยายามทำให้สิ่งนี้กลายเป็น "แนวปฏิบัติที่ดีที่สุด" ของทีมของฉันเพื่อรักษา procs ของเราซึ่งโดยทั่วไปจะต้องคัดลอก / เผยแพร่ไปยังฐานข้อมูลหลายแห่ง
NateJ

2
ยังพิจารณาว่าบางคนต้องการGRANTงบอย่างชัดเจนในสคริปต์ในกรณีที่พวกเขาเปลี่ยน ; เพื่อให้ยังคงมีเหตุผลที่จะใช้แทนDROP ALTER
Cody Stott

123

หากคุณกำลังมองหาวิธีที่ง่ายที่สุดในการตรวจสอบการมีอยู่ของวัตถุฐานข้อมูลก่อนที่จะลบออกนี่เป็นวิธีหนึ่ง (ตัวอย่างใช้ SPROC เช่นเดียวกับตัวอย่างของคุณด้านบน แต่สามารถแก้ไขสำหรับตารางดัชนี ฯลฯ ... ):

IF (OBJECT_ID('MyProcedure') IS NOT NULL)
  DROP PROCEDURE MyProcedure
GO

นี่คือรวดเร็วและสวยงาม แต่คุณต้องแน่ใจว่าคุณมีชื่อวัตถุที่ไม่ซ้ำกันในทุกประเภทวัตถุเพราะมันไม่ได้คำนึงถึง

ฉันหวังว่านี่จะช่วยได้!


62
ดีกว่า: ถ้า (OBJECT_ID ('MyProcedure', 'P') ไม่เป็นโมฆะ) DROP PROCEDURE MyProcedure GO
alerya

33

ฉันรู้ว่าคุณต้องการที่จะ "แก้ไขขั้นตอนหากมีอยู่และลบออกหากไม่มีอยู่" แต่ฉันเชื่อว่ามันง่ายกว่าที่จะวางขั้นตอนและสร้างใหม่อีกครั้ง ต่อไปนี้เป็นวิธียกเลิกกระบวนการเฉพาะเมื่อมีอยู่แล้ว:

IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL
    DROP PROCEDURE MyProcedure
GO

พารามิเตอร์ที่สองบอกOBJECT_IDเพียงมองหาวัตถุที่มีobject_type = 'P', ขั้นตอนที่ถูกเก็บไว้:

AF = ฟังก์ชันการรวม (CLR)

C = ข้อ จำกัด การตรวจสอบ

D = DEFAULT (ข้อ จำกัด หรือสแตนด์อะโลน)

F = ข้อ จำกัด ของคีย์ต่างประเทศ

FN = ฟังก์ชันสเกลาร์ SQL

FS = สเกลาร์ประกอบ (CLR) ฟังก์ชันสเกลาร์

FT = ฟังก์ชั่นที่มีค่าเป็นตาราง (Assembly) (CLR)

IF = ฟังก์ชัน SQL ตารางที่มีค่าแบบอินไลน์ SQL

IT = ตารางภายใน

P = โพรซีเดอร์ที่เก็บ SQL

PC = Assembly (CLR) ขั้นตอนการจัดเก็บ

PG = คู่มือแผน

PK = ข้อ จำกัด คีย์หลัก

R = กฎ (แบบเก่าแบบสแตนด์อะโลน)

RF = การจำลองแบบตัวกรองขั้นตอน

S = ตารางฐานระบบ

SN = คำพ้อง

SO = วัตถุลำดับ

TF = ฟังก์ชันตารางที่มีค่าเป็น SQL

TR = ทริกเกอร์

คุณสามารถรับรายการตัวเลือกทั้งหมดผ่าน:

SELECT name 
FROM master..spt_values
WHERE type = 'O9T'

1
TF หายไป ยัง +1 สำหรับการให้รายการนี้
Crono

TR สำหรับ Trigger ด้วย
CarlosOro


23

ฉันรู้ว่ามันเป็นโพสต์ที่เก่ามาก แต่เนื่องจากสิ่งนี้ปรากฏในผลการค้นหาอันดับต้น ๆ ดังนั้นจึงเป็นการเพิ่มการอัปเดตล่าสุดสำหรับผู้ที่ใช้SQL Server 2016 SP1 -

create or alter procedure procTest
as
begin
 print (1)
end;
go

สิ่งนี้จะสร้างกระบวนงานที่เก็บไว้หากไม่มีอยู่ แต่จะทำการเปลี่ยนแปลงหากมีอยู่

การอ้างอิง


1
นี่คือดังนั้นประโยชน์
AgentFire

ฉันต้องการเน้นสิ่งนี้ใช้งานได้เฉพาะใน SQL Studio - ในไฟล์ sql มันล้มเหลวสำหรับฉัน
James L.

10

DROP IF EXISTS เป็นคุณลักษณะใหม่ของ SQL Server 2016

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

DROP  PROCEDURE IF EXISTS dbo.[procname]

1
นี่ไม่ใช่ไวยากรณ์ของ SqlServer ... , คำแนะนำในการลบคำตอบก่อนที่ผู้คนจะเริ่ม downvoting และเพื่อหลีกเลี่ยงความสับสนสำหรับมือใหม่
Pawel Czapski

@ PawelCz ใช้ได้กับ SQL Server 2016 ขึ้นไปฉันได้รับคำตอบใหม่ ขอบคุณสำหรับความคิดเห็น!
JayJay

นี่ไม่ใช่คำตอบที่โพสต์ต้นฉบับ มีความแตกต่างเล็กน้อยระหว่างการปล่อยและสร้างใหม่โดยอัตโนมัติและการสร้างก็ต่อเมื่อไม่มีอยู่ การวางพรอกซีจะทำให้การรักษาความปลอดภัยหล่นซึ่งอาจมีการเขียนสคริปต์ไว้
Ron

7

ฉันมีข้อผิดพลาดเดียวกัน ฉันรู้ว่ากระทู้นี้ค่อนข้างตายแล้ว แต่ฉันต้องการตั้งค่าตัวเลือกอื่นนอกเหนือจาก "ขั้นตอนที่ไม่ระบุชื่อ"

ฉันแก้ไขมันเช่นนี้

  1. ตรวจสอบว่ามีกระบวนงานที่เก็บไว้หรือไม่:

    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='my_procedure') BEGIN
        print 'exists'  -- or watever you want
    END ELSE BEGIN
        print 'doesn''texists'   -- or watever you want
    END
  2. อย่างไรก็ตาม"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"ยังคงมี ฉันแก้ไขมันเช่นนี้

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE -- view procedure function or anything you want ...
  3. ฉันท้ายด้วยรหัสนี้:

    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('my_procedure'))
    BEGIN
        DROP PROCEDURE my_procedure
    END
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].my_procedure ...

คุณไม่จำเป็นต้องเริ่มต้นและจุดสิ้นสุดถ้าหากมันเป็นเพียง 1 บรรทัดของรหัสเช่น DROP PROCEDURE ...
ฟิลลิป Senn

คำเตือน: ฟังก์ชั่น 'ตรวจสอบว่ามีกระบวนงานที่เก็บไว้' จะส่งคืน 'มีอยู่' เสมอไม่ว่าคุณจะใส่ชื่อฟังก์ชันใด (สำหรับ T-SQL) เป็นการตรวจสอบที่ไม่น่าเชื่อถือ
Ryan Battistone

ทางเลือกที่ดีกว่า: IF EXISTS (เลือก 1 จาก sys.procedures WHERE name = 'name_of_table_as_seen_in_sysprocedures') BEGIN เลือก -1 เป็น 'สถานะ' END
Ryan Battistone

5

นี่คือวิธีการและการใช้เหตุผลในการใช้วิธีนี้ มันไม่สวยเท่าการแก้ไข proc ที่เก็บไว้ แต่มีข้อดีและข้อเสีย ...

อัปเดต: คุณสามารถรวมการโทรทั้งหมดนี้ไว้ในธุรกรรม รวมถึงขั้นตอนการจัดเก็บจำนวนมากในการทำธุรกรรมเดียวซึ่งสามารถกระทำหรือย้อนกลับทั้งหมด ข้อดีอีกอย่างของการห่อในธุรกรรมคือโพรซีเดอร์ที่เก็บไว้มีอยู่เสมอสำหรับการเชื่อมต่อ SQL อื่น ๆ ตราบใดที่ไม่ได้ใช้ระดับการแยกธุรกรรม READ UNCOMMITTED!

1) เพื่อหลีกเลี่ยงการเปลี่ยนแปลงเช่นเดียวกับการตัดสินใจของกระบวนการ กระบวนการของเราคือถ้ามีอยู่เสมอสร้างแล้ว หากคุณทำแบบเดียวกันกับสมมติว่า PROC ใหม่นั้นเป็น proc ที่ต้องการการจัดเลี้ยงเพื่อเปลี่ยนเป็นเรื่องที่ยากขึ้นเพราะคุณจะต้องมี IF EXISTS ALTER ELSE CREATE

2) คุณต้องวาง CREATE / ALTER เป็นการโทรครั้งแรกในแบทช์ดังนั้นคุณจึงไม่สามารถสรุปลำดับของการอัพเดตโพรซีเดอร์ในธุรกรรมนอก SQL แบบไดนามิกได้ โดยทั่วไปถ้าคุณต้องการเรียกใช้การอัปเดตโพรซีเดอร์ทั้งหมดหรือย้อนกลับโดยไม่เรียกคืนการสำรองฐานข้อมูลนี่เป็นวิธีการทำทุกอย่างในแบทช์เดียว

IF NOT EXISTS (select ss.name as SchemaName, sp.name as StoredProc 
    from sys.procedures sp
    join sys.schemas ss on sp.schema_id = ss.schema_id
    where ss.name = 'dbo' and sp.name = 'MyStoredProc')
BEGIN
    DECLARE @sql NVARCHAR(MAX)

    -- Not so aesthetically pleasing part. The actual proc definition is stored
    -- in our variable and then executed.
    SELECT @sql = 'CREATE PROCEDURE [dbo].[MyStoredProc]
(
@MyParam int
)
AS
SELECT @MyParam'
    EXEC sp_executesql @sql
END

5

ใน SQL Server 2008 เป็นต้นไปคุณสามารถใช้ " INFORMATION_SCHEMA.ROUTINES"

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_NAME = 'MySP'
        AND ROUTINE_TYPE = 'PROCEDURE') 

3

เห็นได้ชัดว่าฉันไม่ได้มีชื่อเสียงต้องลงคะแนนหรือแสดงความคิดเห็น แต่ฉันแค่อยากจะบอกว่าคำตอบของเจฟฟ์ที่ใช้ EXEC (sp_executesql อาจจะดีกว่า) เป็นวิธีที่จะไปแน่นอน การวางและสร้างโพรซีเดอร์ที่จัดเก็บใหม่อีกครั้งจะทำให้งานเสร็จสิ้นในที่สุด แต่มีบางช่วงเวลาที่โพรซีเดอร์ที่เก็บไม่มีอยู่เลยและอาจแย่มากโดยเฉพาะอย่างยิ่งถ้านี่เป็นสิ่งที่จะ วิ่งซ้ำ ๆ ฉันมีปัญหาทุกอย่างเกี่ยวกับแอปพลิเคชันของฉันเนื่องจากเธรดพื้นหลังกำลังทำ IF EXISTS DROP ... สร้างพร้อมกันอีกเธรดหนึ่งพยายามใช้โพรซีเดอร์ที่เก็บไว้


3

** วิธีที่ง่ายที่สุดในการปล่อยและสร้าง proc ที่เก็บไว้ใน T-Sql คือ **

Use DatabaseName
go
If Object_Id('schema.storedprocname') is not null
begin
   drop procedure schema.storedprocname
end
go

create procedure schema.storedprocname
as

begin
end

3

นี่คือสคริปต์ที่ฉันใช้ ด้วยฉันหลีกเลี่ยงการวางและสร้าง procs ที่เก็บไว้โดยไม่จำเป็น

IF NOT EXISTS (
    SELECT *
    FROM sys.objects
    WHERE object_id = OBJECT_ID(N'[dbo].[uspMyProcedure]')
    )
BEGIN
  EXEC sp_executesql N'CREATE PROCEDURE [dbo].[uspMyProcedure] AS select 1'
END
GO

ALTER PROCEDURE [dbo].[uspMyProcedure] 
    @variable1 INTEGER  
AS
BEGIN
   -- Stored procedure logic
END

2

ตรวจสอบถ้ามีอยู่สำหรับกระบวนงานที่เก็บไว้

IF EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID
             (N'[Schema].[Procedure_Name]') AND type IN (N'P', N'PC'))
BEGIN
       DROP PROCEDURE [Schema].[Procedure_Name]
       Print('Proceudre dropped => [Schema].[Procedure_Name]')
END

ตรวจสอบว่ามีอยู่สำหรับทริกเกอร์ฟังก์ชันโดยคลิกที่ลิงค์ด้านล่างหรือไม่http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html


1

ทำไมคุณไม่ไปอย่างเรียบง่ายเหมือนกัน

    IF EXISTS(SELECT * FROM sys.procedures WHERE NAME LIKE 'uspBlackListGetAll')
    BEGIN
         DROP PROCEDURE uspBlackListGetAll
    END
    GO

    CREATE Procedure uspBlackListGetAll

..........


แนวคิดที่ไม่ดีที่จะใช้คำสั่ง LIKE% ที่นี่ เกิดอะไรขึ้นถ้า OP มี sproc อื่นเช่น uspBlackListGetAll_V2 ที่พวกเขาไม่ต้องการทิ้ง
Dave Hogan

@DaveHogan ฉันเห็นด้วย อย่างไรก็ตามเขาไม่ได้ทำหน้าที่%ดังนั้นในLIKEฐานะที่เป็น=
Diego Jancic

1
@DiegoJancic ถ้าคุณดูประวัติที่แก้ไขแล้วคุณจะเห็นว่าเดิมมี '%'
Dave Hogan

0

นอกจากคำตอบจาก@Geoffฉันได้สร้างเครื่องมืออย่างง่ายซึ่งสร้างไฟล์ SQL ซึ่งเป็นคำสั่งสำหรับโพรซีเดอร์ที่เก็บไว้มุมมองฟังก์ชั่นและทริกเกอร์

ดูMyDbUtils @ CodePlex ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันคิดว่า Management Studio ให้เครื่องมือดังกล่าวแล้ว เรียกว่า "สร้างสคริปต์"
Hybris95

0

ฉันสงสัย! ทำไมฉันไม่เขียนข้อความค้นหาทั้งหมดเช่น

GO
create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int
as
begin
insert into tblClass values (@ClassName,@ClassFee)
end

GO
create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID       int
as
begin
insert into tblSection values(@SectionName,@ClassID)
end

Go
create procedure test
as
begin 
select * from tblstudent
end

ฉันรู้แล้วว่าสองขั้นตอนแรกมีอยู่แล้ว sql จะเรียกใช้แบบสอบถามจะให้ข้อผิดพลาดของสองขั้นตอนแรก แต่ก็ยังจะสร้างขั้นตอนสุดท้าย SQl ตัวเองดูแลสิ่งที่มีอยู่แล้วนี่คือสิ่งที่ฉันทำทุกอย่างของฉัน ลูกค้า!


-2

สร้างขั้นตอนหากไม่พบ 'proc-name' () เริ่มต้น ... END


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