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

Transact-SQL (T-SQL) เป็นภาษาถิ่นของ SQL ที่ใช้โดย Microsoft SQL Server และ Sybase ของ SAP

1
เราควรใช้ QUOTENAME เพื่อป้องกันการโจมตีจากการฉีดหรือไม่
ฉันดูขั้นตอนการจัดเก็บแบบเก่าวันนี้และสังเกตว่ามันใช้quotenameกับพารามิเตอร์อินพุต หลังจากขุดลงไปเพื่อหาว่ามันทำอะไรฉันก็เจอเว็บไซต์นี้ ตอนนี้ฉันเข้าใจแล้วว่ามันทำอะไรและจะใช้อย่างไร แต่เว็บไซต์บอกว่ามันถูกใช้เพื่อลดการโจมตีจากการฉีด SQL เมื่อฉันใช้ในการพัฒนาแอพที่สอบถามฐานข้อมูลโดยตรงโดยใช้ asp.net ฉันจะใช้พารามิเตอร์ ADO.Net เพื่อส่งผ่านการป้อนข้อมูลของผู้ใช้เป็นค่าที่แท้จริงและไม่เคยกังวลเกี่ยวกับการปกป้องในขั้นตอนการจัดเก็บของฉัน ตอนนี้ฉันกำลังเขียนโพรซีเดอร์ที่เก็บไว้ซึ่งจะถูกใช้โดยแอปพลิเคชันที่ฉันไม่ได้เขียนดังนั้นฉันจึงจำเป็นต้องลองและป้องกันจากการโจมตีของการฉีดที่ระดับโพรซีเดอร์เป็นquotenameวิธีที่ดีที่สุดในการทำสิ่งนี้ วิธี? รหัสที่ทำให้ฉันในรูปแบบความคิดนี้ ( @parm1เป็นพารามิเตอร์ที่ผู้ใช้ป้อน): 'SELECT project [Project], project_desc [Description], customer [Customer], cpnyid [Company] FROM PJPROJ (nolock) where project like ' + quotename(@parm1,'''') + '

3
ฉันควรเพิ่มฟิลด์การเพิ่ม / ตัวตนอัตโนมัติลงในตารางตัวอ้างอิงโยงเพื่อวัตถุประสงค์ในการ PK หรือไม่
ฉันเพิ่มตารางการอ้างอิงโยงต่อไปนี้ในฐานข้อมูลที่โฮสต์บน SQL Server ของฉัน: company_id bigint not null (FK) org_path nvarchar (2048) not null company_idข้อมูลหมายถึงidข้อมูลในตารางอื่น (ซึ่งมันเป็นคีย์หลัก) ระบุว่ายังสามารถมีได้หลายระเบียนด้วยเหมือนกัน company_idคีย์หลักใด ๆ จะต้องใช้ทั้งสองเขตข้อมูล อย่างไรก็ตามฉันไม่สามารถสร้างคีย์โดยใช้ทั้งสองฟิลด์ได้เนื่องจากorg_pathSQL Server ยาวเกินไป สำหรับorg_pathนี่เป็นตารางเดียวที่มีอยู่ มีโอกาสทุกคนที่คำสั่งไปยังตารางนี้จะถูกถามอย่างใดอย่างหนึ่งคือทุกรายการหรือทุกรายการโดยorg_path company_idหรือจะใช้วิธีอื่นดูน่าสงสัยว่าตารางนี้จะถูกสอบถามโดยorg_pathหรือจะนำไปทางอื่นก็มีลักษณะที่น่าสงสัยว่าตารางนี้จะเคยได้รับการสอบถามโดยนอกจากนี้ยังไม่น่าorg_pathจะมีการอัปเดตและมีแนวโน้มที่จะถูกแทรกและอาจถูกลบ ฉันคาดหวังว่าจำนวนแถวทั้งหมดจะอยู่ในพันต่ำ นอกจากนี้สาเหตุที่nvarchar (2048)เป็นเพราะค่าต้องเลียนแบบในฐานข้อมูลบุคคลที่สาม ตัวอย่างทั่วไปจะเป็นสิ่งที่ต้องการ \Translation Providers\[customer name]\[order name]\ และสามารถมีกำกับได้ ดังนั้นคำถามของฉันคือ: มันจะมีประสิทธิภาพมากขึ้นในการเพิ่มidเขตข้อมูลการเพิ่มอัตโนมัติและใช้ร่วมกับcompany_idเป็นคีย์หลักหรือมันจะเพิ่มค่าใช้จ่ายที่ไม่จำเป็น - และความจริงที่ว่าcompany_idเป็นคีย์หลักในตารางอื่นมี ผลที่นี่?

1
เอาชนะการผสานเข้าร่วม (สแกนดัชนี) ด้วยค่าคีย์เดี่ยวอย่างชัดเจนบนคีย์ต่างประเทศ
เพิ่ม 7/11ปัญหานี้เกิดจากการหยุดชะงักเนื่องจากการสแกนดัชนีระหว่าง MERGE JOIN ในกรณีนี้ธุรกรรมที่พยายามรับ S lock ในดัชนีทั้งหมดที่ตารางหลัก FK แต่ก่อนหน้านี้ธุรกรรมอื่นวาง X lock ไว้ในค่าคีย์ของดัชนี ให้ฉันเริ่มต้นด้วยตัวอย่างเล็ก ๆ (ใช้ TSQL2012 DB จาก 70-461 cource): CREATE TABLE [Sales].[Orders]( [orderid] [int] IDENTITY(1,1) NOT NULL, [custid] [int] NULL, [empid] [int] NOT NULL, [shipperid] [int] NOT NULL, ... ) คอลัมน์[custid], [empid], [shipperid]เป็นพารามิเตอร์ที่มีการเชื่อมโยงกัน[Sales].[Customers], [HR].[Employees], [Sales].[Shippers]ตามลำดับ ในแต่ละกรณีเรามีดัชนีคลัสเตอร์ในคอลัมน์ที่อ้างถึงในตาราง parrent ALTER …

2
วิธีการแผ่ผลของตารางที่มีสองตารางที่ "เกี่ยวข้อง" อย่างเกี่ยวข้องได้อย่างไร
ฉันได้จัดตารางบางส่วนในฐานข้อมูลของฉันให้มีความยืดหยุ่นมากขึ้น แต่ฉันไม่แน่ใจว่าจะเขียน SQL อย่างไรเพื่อดึงข้อมูลที่มีความหมายออกมา ฉันมีตารางต่อไปนี้ (ค่อนข้างยากสำหรับตัวอย่างที่ชัดเจน): CREATE TABLE Loans( Id int, SchemaId int, LoanNumber nvarchar(100) ); CREATE TABLE SchemaFields( Id int, SchemaId int, FieldName nvarchar(255) ); CREATE TABLE LoanFields( Id int, LoanId int, SchemaFieldId int, FieldValue nvarchar(4000) ); ด้วยข้อมูลต่อไปนี้: INSERT INTO Loans (Id, SchemaId, LoanNumber) VALUES (1, 1, 'ABC123'); INSERT …

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
ตัวแปรสำหรับชื่อองค์ประกอบ
ฉันมีรหัส tSQL นี้ซึ่งใช้งานได้: SELECT c.logguid, a.b.value('./PropertyValue', 'varchar(max)') asd FROM [dnn].[dbo].[EventLog2] c cross apply sss.nodes('/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y")]') as a(b) อย่างไรก็ตามสิ่งที่ฉันต้องการที่จะสามารถทำได้คือการส่งผ่านรายการแบบไดนามิกของค่าจำนวนมากซึ่งเป็น OR ระหว่างแต่ละค่าเช่น SELECT c.logguid, a.b.value('./PropertyValue', 'varchar(max)') asd FROM [dnn].[dbo].[EventLog2] c cross apply sss.nodes( '/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y") or PropertyName=sql:variable("@a") and PropertyValue=sql:variable("@b") ]' ) as a(b) มีวิธีทำเช่นนี้หรือไม่?
9 t-sql  xml 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.