คำถามติดแท็ก dynamic-sql

การสร้างแบบสอบถามที่รันไทม์ด้วยการดำเนินการต่อสตริงและดำเนินการสืบค้นจากสตริงนั้น

4
มีวิธีสร้างตารางสร้างสคริปต์ใน TSQL หรือไม่?
มีวิธีสร้างสคริปต์สร้างจากตารางที่มีอยู่ใน T-SQL (โดยไม่ใช้ SMO เนื่องจาก T-SQL ไม่สามารถเข้าถึง SMO ได้) สมมติว่าเป็นกระบวนงานที่เก็บไว้ที่รับชื่อตารางและส่งคืนสตริงที่มีสคริปต์สร้างสำหรับตารางที่กำหนดหรือไม่ ตอนนี้ให้ฉันอธิบายสถานการณ์ที่ฉันกำลังเผชิญเนื่องจากอาจมีวิธีอื่นในการเข้าถึงสิ่งนี้ ฉันมีอินสแตนซ์ที่มีฐานข้อมูลหลายโหล ฐานข้อมูลเหล่านี้ทั้งหมดมีสคีมาเหมือนกันทั้งหมดตารางเดียวกันดัชนีและอื่น ๆ พวกเขาถูกสร้างขึ้นเป็นส่วนหนึ่งของการติดตั้งซอฟต์แวร์บุคคลที่สาม ฉันต้องมีวิธีในการทำงานกับพวกเขาเพื่อให้ฉันสามารถรวบรวมข้อมูลจากพวกเขาในลักษณะเฉพาะกิจ ผู้คนที่ดีที่ dba.se ได้ช่วยฉันที่นี่แล้วจะสร้างทริกเกอร์ในฐานข้อมูลอื่นได้อย่างไร ขณะนี้ฉันต้องการค้นหาวิธีการเลือกจากตารางในฐานข้อมูลทั้งหมด ฉันได้บันทึกชื่อฐานข้อมูลทั้งหมดลงในตารางที่เรียกDatabaseesและฉันเขียนสคริปต์ต่อไปนี้เพื่อดำเนินการคำสั่งที่เลือกในพวกเขาทั้งหมด: IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp select * into #tmp from Database1.dbo.Table1 where 1=0 DECLARE @statement nvarchar(max) = N'insert into #tmp select * from Table1 where Column1=0 …

3
ทางเลือกอื่นในการต่อสตริงหรือดำเนินการตามขั้นตอนเพื่อป้องกันการทำซ้ำรหัสแบบสอบถาม SQL?
คำเตือน: โปรดอดทนกับฉันในฐานะคนที่ใช้ฐานข้อมูลเพียงเล็กน้อยในเวลาทำงานของเขา (ส่วนใหญ่ฉันใช้การเขียนโปรแกรม C ++ ในงานของฉัน แต่ทุกเดือนที่แปลกฉันต้องค้นหา / แก้ไข / เพิ่มบางสิ่งในฐานข้อมูล Oracle) ฉันจำเป็นต้องเขียนแบบสอบถาม SQL ที่ซับซ้อนซ้ำ ๆ ทั้งสำหรับคิวรีแบบเฉพาะกิจและแบบสอบถามที่มีอยู่ในแอปพลิเคชัน การเขียนสิ่งที่น่ารังเกียจในภาษาโปรแกรมแบบดั้งเดิมจะทำให้คุณประสบปัญหาอย่างหนัก แต่ฉัน ( I ) ยังไม่สามารถหาเทคนิคที่เหมาะสมในการป้องกันการทำซ้ำรหัสแบบสอบถาม SQL แก้ไข: 1 ผมอยากจะขอบคุณ answerers ที่ให้การปรับปรุงที่ดีในการเดิมของฉันตัวอย่างเช่น อย่างไรก็ตามคำถามนี้ไม่เกี่ยวกับตัวอย่างของฉัน มันเกี่ยวกับการทำซ้ำในแบบสอบถาม SQL เป็นเช่นนี้คำตอบ ( JackP , ลีห์ ) เพื่อให้ห่างไกลจะได้งานที่ดีของการแสดงให้เห็นว่าคุณสามารถลด repetitiveness โดยการเขียนคำสั่งที่ดีกว่า อย่างไรก็ตามแม้แล้วคุณเผชิญ repetitiveness บางอย่างที่เห็นได้ชัดว่าไม่สามารถเอาออก: นี่เสมอ nagged ฉันกับ SQL ในภาษาการเขียนโปรแกรม "ดั้งเดิม" …

2
เหตุใด SQL Injection จึงไม่เกิดขึ้นกับแบบสอบถามนี้ภายในกระบวนงานที่เก็บไว้
ฉันทำขั้นตอนการจัดเก็บต่อไปนี้: ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender ตอนนี้ฉันพยายามทำอะไรแบบนี้ บางทีฉันอาจทำผิด แต่ฉันต้องการให้แน่ใจว่ากระบวนการดังกล่าวสามารถป้องกัน SQL Injection: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' ภาพด้านล่างแสดง SQL ด้านบนที่ถูกดำเนินการใน SSMS และผลลัพธ์ถูกแสดงอย่างถูกต้องแทนที่จะมีข้อผิดพลาด: Btw ฉันเพิ่มส่วนต่อไปที่อัฒภาคหลังจากแบบสอบถามเสร็จสิ้นการดำเนินการ จากนั้นฉันก็ดำเนินการอีกครั้ง แต่เมื่อฉันตรวจสอบเพื่อดูว่าตาราง tblActor มีอยู่หรือไม่มันยังคงอยู่ที่นั่น ฉันกำลังทำอะไรผิดหรือเปล่า? …

4
ฉันจะสร้าง CROSS JOIN ที่หมุนได้ได้อย่างไรโดยที่ไม่ทราบนิยามของตารางที่ได้
เมื่อกำหนดสองตารางที่มีจำนวนแถวที่ไม่ได้กำหนดด้วยชื่อและค่าฉันจะแสดงCROSS JOINฟังก์ชันที่มีเครื่องหมายทับค่าของพวกมันได้อย่างไร CREATE TEMP TABLE foo AS SELECT x::text AS name, x::int FROM generate_series(1,10) AS t(x); CREATE TEMP TABLE bar AS SELECT x::text AS name, x::int FROM generate_series(1,5) AS t(x); ตัวอย่างเช่นถ้าฟังก์ชันนั้นเป็นการคูณฉันจะสร้างตาราง (การคูณ) เช่นเดียวกับด้านล่างได้อย่างไร (arg1,arg2,result)แถวเหล่านั้นทั้งหมดสามารถสร้างขึ้นได้ด้วย SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result FROM foo CROSS JOIN bar; ดังนั้นนี่เป็นเพียงคำถามของงานนำเสนอฉันต้องการสิ่งนี้เพื่อทำงานกับชื่อที่กำหนดเอง …

2
สร้างมุมมองในฐานข้อมูลที่ระบุด้วย SQL แบบไดนามิก?
ฉันกำลังเขียน sql แบบไดนามิกเพื่อวางและสร้างมุมมองในฐานข้อมูลอื่น ดังนั้นฉันจึงเขียนว่า: set @CreateViewStatement = ' USE ['+ @DB +']; CREATE VIEW [dbo].[MyTable] AS SELECT ........something exec (@CreateViewStatement) มันทำให้ฉันมีข้อผิดพลาด: 'สร้างมุมมอง' ต้องเป็นคำสั่งแรกในชุดการสืบค้น ถ้าฉันลบคำสั่ง USE DATABASE มันใช้งานได้ดี แต่ฐานข้อมูลไม่ได้ระบุอีกต่อไป .... ฉันจะแก้ปัญหานี้ได้อย่างไร

1
ข้อความค้นหาที่ผู้ใช้แบ่งปัน: ไดนามิก SQL กับ SQLCMD
ฉันต้องรีแฟคเตอร์และจัดทำเอกสารfoo.sqlแบบสอบถามจำนวนหนึ่งซึ่งจะใช้ร่วมกันโดยทีมสนับสนุนด้านเทคนิคของ DB (สำหรับการกำหนดค่าลูกค้าและสิ่งต่างๆเช่นนั้น) มีตั๋วหลายประเภทที่มาเป็นประจำที่ลูกค้าแต่ละรายมีเซิร์ฟเวอร์และฐานข้อมูลของตัวเอง แต่ไม่เช่นนั้นสคีมาจะเหมือนกันทั่วกระดาน กระบวนงานที่เก็บไว้ไม่ใช่ตัวเลือกในเวลาปัจจุบัน ฉันกำลังถกเถียงกันว่าจะใช้ไดนามิกหรือ SQLCMD ฉันไม่ได้ใช้อะไรมากมายเพราะฉันค่อนข้างใหม่ที่ SQL Server การสคริปต์ SQLCMD ฉันรู้สึกว่า "ดู" สะอาดกว่าสำหรับฉันและง่ายต่อการอ่านและเปลี่ยนแปลงการสืบค้นเล็กน้อยตามต้องการ แต่ยังบังคับให้ผู้ใช้เปิดใช้งานโหมด SQLCMD แบบไดนามิกนั้นยากกว่าเนื่องจากการเน้นไวยากรณ์เสียไปเนื่องจากการสืบค้นที่เขียนโดยใช้การจัดการสตริง สิ่งเหล่านี้กำลังถูกแก้ไขและรันโดยใช้ Management Studio 2012, SQL เวอร์ชัน 2008R2 อะไรคือข้อดี / ข้อเสียของวิธีใดวิธีหนึ่งหรือ SQL Server "วิธีปฏิบัติที่ดีที่สุด" บางวิธีในวิธีหนึ่งหรือวิธีอื่น เป็นหนึ่งในนั้น "ปลอดภัย" กว่าอีกหรือไม่ ตัวอย่างแบบไดนามิก: declare @ServerName varchar(50) = 'REDACTED'; declare @DatabaseName varchar(50) = 'REDACTED'; declare @OrderIdsSeparatedByCommas varchar(max) …

4
ทำไมคุณต้องการหลีกเลี่ยง Dynamic SQL ในขั้นตอนการจัดเก็บ?
ฉันเคยได้ยินคนหนึ่งบอกว่าคุณไม่ต้องการใช้ Dynamic SQL คุณสามารถยกตัวอย่างที่เป็นรูปธรรมหรือตัวอย่างในชีวิตจริงได้ไหม ส่วนตัวฉันรหัสมันสองสามครั้งในฐานข้อมูลของฉัน ฉันคิดว่ามันใช้ได้เพราะความยืดหยุ่น ฉันเดาว่าเกี่ยวกับ SQL Injection หรือ Performance มีอะไรอีกไหม

2
วิธีการเปลี่ยนฐานข้อมูลแบบไดนามิกโดยใช้ TSQL
ฉันมีปัญหากับการพยายามเปลี่ยนบริบทของ SSMS เป็นฐานข้อมูลที่ระบุใน SQL แบบไดนามิก: EXEC sys.sp_executesql N'USE db1 ' ; สามารถดำเนินการได้สำเร็จ แต่บริบทฐานข้อมูลของ SSMS จะไม่เปลี่ยนแปลง ฉันได้ลองปรับเปลี่ยนเล็กน้อยตามข้างบน DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50) SET @db = N'db1' SET @sql = N'Use ' + @db EXEC sp_executesql @sql ดำเนินการสำเร็จอีกครั้ง แต่ฐานข้อมูลไม่เปลี่ยนแปลง

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

1
กระบวนงานที่เก็บไว้เพื่อส่งคืนข้อมูลตารางที่สร้างขึ้นแบบไดนามิก
เรื่องราวย้อนกลับอย่างรวดเร็วเรากำลังทำงานกับผู้ขายภายนอกที่มีระบบสำรวจ ระบบไม่ได้ถูกออกแบบมาอย่างดีที่สุดเมื่อคุณสร้างแบบสำรวจใหม่และระบบจะสร้างตารางใหม่เช่น: Tables ____ Library_1 -- table for Survey 1 SurveyId int InstanceId int Q_1 varchar(50) Library_2 -- table for Survey 2 SurveyId int InstanceId int Q_2 int Q_3 int Q_4 varchar(255) ตารางจะถูกสร้างขึ้นด้วยการSurveyIdที่ส่วนท้ายของชื่อ ( Library_) และคอลัมน์คำถามจะถูกสร้างขึ้นด้วยการQuestionIdที่ส่วนท้ายของมัน ( Q_) ในการชี้แจงคำถามจะถูกเก็บไว้ในตารางแยกต่างหากดังนั้นในขณะที่รหัสคำถามนั้นเรียงตามลำดับโดยไม่เริ่มต้นที่ 1 สำหรับแต่ละแบบสำรวจ คอลัมน์คำถามจะขึ้นอยู่กับรหัสที่กำหนดให้กับพวกเขาในตาราง ดูเหมือนง่ายพอที่จะสืบค้นยกเว้นเราจำเป็นต้องดึงข้อมูลจากตารางสำรวจทั้งหมดที่จะส่งไปยังระบบอื่นและนี่คือที่มาของปัญหาเนื่องจากตารางจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อมีการเพิ่มแบบสำรวจใหม่โดยหน้า แอปพลิเคชันสิ้นสุดระบบอื่นไม่สามารถจัดการกับโครงสร้างประเภทนี้ได้ พวกเขาต้องการข้อมูลที่สอดคล้องกันเพื่อให้สามารถบริโภคได้ ดังนั้นฉันจึงมอบหมายให้เขียนโพรซีเดอร์ที่เก็บไว้ซึ่งจะดึงข้อมูลจากตารางสำรวจทั้งหมดและวางไว้ในรูปแบบต่อไปนี้: SurveyId InstanceId QNumber Response …

2
ฉันจะสร้างคอลัมน์แทนแบบไดนามิกได้อย่างไร
ฉันมีตาราง (ไม่ได้ออกแบบโดยฉัน) ซึ่งมี 20 คอลัมน์ชื่อแตกต่างกัน นั่นคือขึ้นอยู่กับชนิดของระเบียนที่คุณกำลังดูชื่อที่เกี่ยวข้องของคอลัมน์สามารถเปลี่ยนแปลงได้ ชื่อคอลัมน์ที่เป็นไปได้จะถูกเก็บไว้ในอีกตารางหนึ่งซึ่งฉันสามารถสืบค้นได้ง่ายมาก ดังนั้นข้อความค้นหาที่ฉันกำลังมองหาจะเป็นดังนี้: SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type), Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type) FROM Tbl1 WHERE Type = @Type เห็นได้ชัดว่าใช้งานไม่ได้ดังนั้นฉันจะได้ผลลัพธ์ที่คล้ายกันได้อย่างไร ' ฉันได้ลองสร้างสตริงข้อความค้นหาแล้วEXECUTEค่อยส่งคืน แต่ก็แค่คืน "Command (s) เสร็จสมบูรณ์แล้ว" …

1
sp_execute ต้องการพารามิเตอร์ '@handle' ของประเภท 'int'
ฉันพยายามตรวจสอบขั้นตอนการจัดเก็บหากมีตารางอยู่ในฐานข้อมูลปลายทางของฉัน หากไม่เป็นเช่นนั้นฉันจะสร้างตารางโดยใช้ตาราง data_schema จากฐานข้อมูลต้นทาง อย่างไรก็ตามเมื่อฉันใช้ sp_execute เพื่อพยายามนำกลับมาหากตารางมีอยู่ฉันได้รับข้อผิดพลาดขั้นตอนคาดว่าพารามิเตอร์ '@handle' ของประเภท 'int' ฉันไม่ได้ใช้พารามิเตอร์ @handle มีคนบอกฉันว่าข้อผิดพลาดนี้มีความหมายอย่างไรและทำไมฉันถึงได้รับ ส่วนที่เกี่ยวข้องของรหัสของฉันอยู่ด้านล่าง DECLARE @SQL NVARCHAR(MAX), @Parameters NVARCHAR(4000), @TableNotExists INT, @SourceTable NVARCHAR(200), @DestDB NVARCHAR(200) BEGIN SET @SourceTable = 'table' SET @DestDB = 'database' SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT' SET @SQL = N'USE [' + @DestDB + …

1
sp_prepexec (sp_execute) กับ sp_executeSQL
เนื้อของคำถาม: เป็นขั้นตอนการจัดเก็บจริงกลไกเดียวที่ดำเนินการแคชตารางชั่วคราวหรือทำขั้นตอนการจัดเก็บระบบเช่นsp_executeSQL/ sp_executeยังใช้ประโยชน์จากพวกเขา? ฉันไม่ใช่ DBA ดังนั้นโปรดใช้คำพูดเล็กน้อย โปรแกรมของเราส่งงบเตรียมมากกว่าว่าจาก Profiler ที่ฉันเห็นเรียกใช้ SQL ทั้งหมดที่ผ่านsp_prepexecซึ่งเป็นขั้นตอนของระบบสำหรับทั้งทำงานและsp_prepare sp_executeสิ่งที่ฉันพยายามทำคือหาว่าฉันได้รับประโยชน์จากการแคชตารางชั่วคราว ฉันใช้คู่มือนี้กับ object_id () เพื่อตรวจสอบพฤติกรรม https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html แล้วชี้ # 3 โพสต์บล็อกนี้แสดงให้เห็นว่า EXEC ไม่สามารถใช้แคชตาราง temp แต่ใบออกว่า sp_executesql สามารถ: http://blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- SP-executesql.aspx ในแบบสอบถามของฉันส่งผ่านทางลูกค้าฉันได้สร้างตารางชั่วคราว DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement SELECT 1 AS id INTO …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.