Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Dynamic T-SQL ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½

Π’ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Π½Π°ΠΌ приходится Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· Π½ΠΈΡ… ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ dynamic T-Sql (Π΄Π°Π»Π΅Π΅ ΠΏΠΎ тСксту dynamic sql).

Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ΅Π½ dynamic sql? ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ для сСбя. Π’ ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dynamic sql ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ построСния Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊΠΆΠ΅ dynamic sql Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π² случаях, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ/ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ/ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½ΠΎ значСния/названия приходят Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π”Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ абсурдом, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ dynamic sql.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΌΠΎΠΆΠ½ΠΎ нСсколькими способами:

Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚ΡƒΡ‚ ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ? β€” Запрос ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ всС Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹. Но всС ΠΆΠ΅, Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ стоит:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Π’Π°ΠΊΠΆΠ΅ ΠΎΠ΄Π½ΠΎ ΠΈΠ· прСимущСств использования sp_executesql – это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· OUT ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΠ΄Π½Ρƒ ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ с использованиСм dynamic sql.

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€ (Π΄Π° Π½Π΅Π²Π°ΠΆΠ½ΠΎ, собствСнно, Ρ‡Ρ‚ΠΎ это: Ρ‚ΠΎΠ²Π°Ρ€, Π°Π½ΠΊΠ΅Ρ‚Π° Π½Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π°Π½ΠΊΠ΅Ρ‚Π°). Бмысл Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ свой Π½Π°Π±ΠΎΡ€ свойств (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅Ρ‚, Π° ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠ΅ количСство, ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Как Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π‘Π” – это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹.

Для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½ΡƒΠΆΠ΅Π½ Π±Ρ‹Π» ΠΎΡ‚Ρ‡Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ· сСбя прСдставлял n строк Π½Π° m столбцов. Π“Π΄Π΅ m ΠΈ Π±Ρ‹Π» наш Π½Π°Π±ΠΎΡ€ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². ΠžΡ‚Ρ‡Π΅Ρ‚ собирался ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ»ΠΈ для ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹. Но смысл остаСтся всС Ρ‚ΠΎΡ‚ ΠΆΠ΅: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ содСрТит Ρ€Π°Π·Π½ΠΎΠ΅ количСство столбцов для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ сущСствовала связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ Π±Π΅Π· измСнСния Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π‘Π”. На наш взгляд, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько:

Π’ основС ΠΎΡ‚Ρ‡Π΅Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅ΠΆΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ запрос:

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ Ρ‚ΡƒΡ‚ написали:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ запроса Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ‡Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ стоит Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ dynamic sql, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ способами. Для этого ΠΏΠΎΡ€ΠΎΠΉ трСбуСтся ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ динамичСских T-SQL инструкций Π² Microsoft SQL Server

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ динамичСского T-SQL ΠΊΠΎΠ΄Π°, Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ SQL ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Microsoft SQL Server.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

ДинамичСский ΠΊΠΎΠ΄ Π² Microsoft SQL Server

Microsoft SQL Server позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ SQL инструкции, сформированныС динамичСски, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ½ΠΎΠ³Π΄Π° Π±Π΅Π· этого просто Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ. НапримСр, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ динамичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ взгляда каТутся статичСскими. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ PIVOT, Π΅Π³ΠΎ синтаксис, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ столбцы, количСство ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π°ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ просто Π½Π΅ извСстны. Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½Π°ΠΌ значСния Π² SQL запрос, ΠΈ Ρ‚Π΅ΠΌ самым Π½Π°ΠΌ ΡƒΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΈ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ столбцы, Π² случаС с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ PIVOT, кстати, Ρ€Π°Π½Π΅Π΅ я ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ динамичСского PIVOT.

ДинамичСская SQL инструкция – это просто тСкстовая строка, которая послС прСобразования ΠΈ подставки всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, исполняСтся SQL сСрвСром ΠΊΠ°ΠΊ обычная SQL инструкция.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ SQL ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ просто ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡΡ‚ΠΎΠ²ΡƒΡŽ строку с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, ΠΈΠ»ΠΈ произвСсти ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ строк с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + (плюс).

Π’ Microsoft SQL Server сущСствуСт Π΄Π²Π° способа Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π° выполнСния строки, содСрТащиС SQL инструкции, это: ΠΊΠΎΠΌΠ°Π½Π΄Π° EXECUTE ΠΈ систСмная хранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° sp_executesql.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ²

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² выполнСния динамичСских инструкций, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим тСстовыС Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ TestTable, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π΅ нСсколько строк.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Команда EXECUTE в T-SQL

EXECUTE (сокращСнно EXEC) – ΠΊΠΎΠΌΠ°Π½Π΄Π° для запуска Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ SQL инструкций Π² Π²ΠΈΠ΄Π΅ тСкстовых строк.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ, слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ использованиС динамичСского ΠΊΠΎΠ΄Π° с использованиСм ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ EXEC – это Π½Π΅ бСзопасно! Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ SQL ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для динамичСски ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’Π°ΠΊ Π²ΠΎΡ‚, Ссли эти значСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ клиСнтского прилоТСния, Ρ‚.Π΅. ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈ, соотвСтствСнно, Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π² Π½Π°ΡˆΡƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ врСдоносный ΠΊΠΎΠ΄ Π² Π²ΠΈΠ΄Π΅ тСкста, Π° ΠΌΡ‹ Π΅Π³ΠΎ просто исполним Π² Π‘Π”, думая, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС Ρ‚Π°ΠΊΠΈΠ΅ значСния слСдуСт ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования EXEC Π² T-SQL

БСйчас ΠΌΡ‹ с Π’Π°ΠΌΠΈ сформируСм динамичСский SQL запрос, тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ сохраним Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ EXEC.

ВСкст запроса Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ @SQL_QUERY, Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ @Var1 Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² наш запрос, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ этот запрос стал динамичСским (Π² нашСм случаС ΠΌΡ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ присвоим статичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, хотя это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ запроса ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ вычислСний).

Для формирования строки ΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ строк, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ + (плюс), Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стоит ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² этом случаС выраТСния, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ тСкстовый Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ @Var1 Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… INT, поэтому, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΅Π΅ со строкой, ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊ Ρ‚ΠΈΠΏΡƒ Π΄Π°Π½Π½Ρ‹Ρ… VARCHAR.

Для наглядности Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ SQL запрос Ρƒ нас получился, ΠΌΡ‹ просто посмотрим, Ρ‡Ρ‚ΠΎ Ρƒ нас хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ @SQL_QUERY инструкциСй SELECT.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Π₯ранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° sp_executesql Π² T-SQL

sp_executesql – это систСмная хранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Microsoft SQL Server, которая выполняСт SQL инструкции. Π­Ρ‚ΠΈ инструкции ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‚Π΅ΠΌ самым дСлая ΠΈΡ… динамичСскими.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° sp_executesql ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ указываСтся тСкст SQL инструкции, Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ β€” это ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈ, соотвСтствСнно, подстановка Π² Π½Π°ΡˆΡƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ.

ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ sp_executesql Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Unicode (Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… строк Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ NVARCHAR).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования sp_executesql Π² T-SQL

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с EXEC, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ динамичСскиС значСния, Ρƒ нас это пСрСмСнная @Var1, ΠΌΡ‹ объявим ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ sp_executesql.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql

Π£ мСня Π½Π° этом всС, надСюсь, ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π±Ρ‹Π» Π’Π°ΠΌ интСрСсСн ΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ссли Вас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ возмоТности языка T-SQL, Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΠΎΠΈ видСокурсы ΠΏΠΎ T-SQL, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° обучСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…, ΠΏΠΎΠΊΠ°!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ДинамичСский SQL ΠΈ NDS ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ PL/SQL Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sql. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ динамичСский sqlΠ’Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ «динамичСский SQLΒ» ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ нСпосрСдствСнно Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. БтатичСскими Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ТСстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. «ДинамичСским PL/SQLΒ» Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ†Π΅Π»Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° PL/SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ строятся динамичСски, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ NDS Π² PL/SQL

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ EXECUTE IMMEDIATE ΠΈ OPEN FOR Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ доступны Π² Oracle Forms Builder ΠΈ Oracle Reports Builder Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° вСрсия PL/SQL этих инструмСнтов Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° Π΄ΠΎ Oracle8i ΠΈ Π²Ρ‹ΡˆΠ΅. Для Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсий придСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ этих конструкций; эти Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² клиСнтском ΠΊΠΎΠ΄Π΅ PL/SQL.

Команда EXECUTE IMMEDIATE

Команда EXECUTE IMMEDIATE ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ выполнСния Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL. Она ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

Команда execute immediate ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для выполнСния любой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ° PL/SQL. Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² схСмы (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ† ΠΈΠ»ΠΈ столбцов).

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DDL Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ происходит Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Β­Ρ€Π°Ρ†ΠΈΠΈ. Если Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Π΅ΠΏΠ»Π΅Π½ΠΈΠ΅, обусловлСнноС DDL, ΠΎΡ‚Ρ€Π°ΠΆΠ°Π»ΠΎΡΡŒ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… измСнСниях Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… частях прилоТСния, помСститС Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ DDL Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ„Π°ΠΉΠ»Π΅ auton_ddl.sql.

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π΅ ядро замСняСт Π² SQL-строкС Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с двоСточия β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, :salary_value )

ΠŸΡ€ΠΎΡ‰Π΅ Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚, Π²Π΅Ρ€Π½ΠΎ?

ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ exec_ddl Ρ‚ΠΎΡ‚ ΠΆΠ΅ индСкс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ количСства строк Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ прСдлоТСния WHERE :

ИзмСнСниС числового значСния Π² любом столбцС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ employees:

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠΎΠΌΠ°Π½Π΄Π° EXECUTE IMMEDIATE позволяСт ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ динамичСскиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SQL ΠΈ Π±Π»ΠΎΠΊΠΈ PL/SQL с ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ синтаксисом.

Команда OPEN FOR

Команда OPEN FOR ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅ Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² PL/SQL для NDS ; ΠΎΠ½Π° появилась Π² Oracle7 ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π»Π°ΡΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с курсорными ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Π—Π°Ρ‚Π΅ΠΌ Π΅Π΅ синтаксис Π±Ρ‹Π» Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ многострочных динамичСских запросов. ΠŸΡ€ΠΈ использо­вании ΠΏΠ°ΠΊΠ΅Ρ‚Π° DBMS_SQL рСализация многострочных запросов получаСтся ΠΎΡ‡Π΅Π½ΡŒ слоТной: приходится ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·Π±ΠΎΡ€ ΠΈ подстановку, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ сначала строки, Π° Π·Π°Ρ‚Π΅ΠΌ β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ значСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ столбца. Код получаСтся вСсьма Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ.

Для динамичСского SQL Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Oracle сохранили ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ синтаксис OPEN, Π½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ СстСствСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ REF CURSOR ΠΈ основанная Π½Π° Π½Π΅ΠΌ пСрСмСнная- курсор, Π° Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ OPEN FOR открываСтся динамичСский запрос:

Для выполнСния многострочного запроса (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ запроса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π°Π±ΠΎΡ€ строк) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ:

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ простая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния поля Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² строках, ΠΎΡ‚Π±ΠΈΡ€Π°Π΅ΠΌΡ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСкции WHERE (столбСц ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ числа, Π΄Π°Ρ‚Ρ‹ ΠΈΠ»ΠΈ строки, Ρ„Π°ΠΉΠ» showcol.sp):

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ выглядит Ρ‚Π°ΠΊ:

Π‘Ρ‚ΠΎΠ»Π±Ρ†Ρ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ записи

Команда FETCH Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ showcol ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° осущСствляСт Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° Π² ΡΠ΅Ρ€ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

Π Π°Π±ΠΎΡ‚Π° с Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌ списком ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² спискС FETCH ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠΉ ΠΈ нС­достаточно Π³ΠΈΠ±ΠΊΠΎΠΉ; Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ этого Π½Π°Π±ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ FETCH ΠΈ Ρ‚. Π΄. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Тизнь Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, NDS позволяСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ Π² запись, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ситуациях Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SELECT * Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ; Ссли ваша Ρ‚Π°Π±Π»ΠΈΡ†Π° содСрТит сотни столбцов, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Π²Π°-Ρ‚Ρ€ΠΈ, эта ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΡ€Π°ΠΉΠ½Π΅ нСэффСктивна. Π›ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ записи, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π½Ρ‹ΠΌ трСбованиям. Π­Ρ‚ΠΈ структуры Π»ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² спСцификации ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΒ­ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎ всСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

Π‘ Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

БСкция USING Π² OPEN FOR

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ выглядит Ρ‚Π°ΠΊ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° OPEN FOR содСрТит Π΄Π²Π° Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ USING :

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² Π½ΠΎΠ²ΠΎΠΉ вСрсии showcol Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° всСх Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠ², принятых Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² 1982 Π³ΠΎΠ΄Ρƒ:

О Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… катСгориях динамичСского SQL

Π’Π°Π±Π»ΠΈΡ†Π° 1. Π§Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ динамичСского SQL

Ρ‚ΠΈΠΏΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ NDS
ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 1Π‘Π΅Π· запросов; Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DDL ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ UPDATE, INSERT, MERGE ΠΈ DELETE Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²EXECUTE IMMEDIATE Π±Π΅Π· сСкций USING ΠΈ INTO
ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 2Π‘Π΅Π· запросов; Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ DDL ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
UPDATE, INSERT, MERGE ΠΈ DELETE с фиксированным
количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
EXECUTE IMMEDIATE с сСкциСй USING
ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 3
(ΠΎΠ΄Π½Π° строка)
Запросы (SELECT) с фиксированным количСством
столбцов ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², с Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ ΠΎΠ΄Π½ΠΎΠΉ строки
Π΄Π°Π½Π½Ρ‹Ρ…
EXECUTE IMMEDIATE с сСкциями
USING ΠΈ INTO
ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 3
(нСсколько строк)
Запросы (SELECT) с фиксированным количСством
столбцов ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², с Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ
Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк Π΄Π°Π½Π½Ρ‹Ρ…
EXECUTE IMMEDIATE с сСкциями
USING ΠΈ BULK COLLECT INTO
ΠΈΠ»ΠΈ OPEN FOR с динамичСской строкой
ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 4Команда, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ количСство Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… столб-
Ρ†ΠΎΠ² (для запроса) ΠΈΠ»ΠΈ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² нСизвСстно Π΄ΠΎ стадии выполнСния
Для ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 4 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ DBMS_SQL

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 1

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° DDL являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ динамичСского SQL ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 1:

Команда UPDATE Ρ‚Π°ΠΊΠΆΠ΅ относится ΠΊ динамичСскому SQL ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 1, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Сдин­ствСнным измСняСмым аспСктом являСтся имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚:

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 2

Если Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π° ТСстко фиксированных значСния Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ DML Ρ„ΠΎΡ€Β­ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€), появляСтся динамичСский SQL ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 2:

БСкция USING содСрТит значСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ подставлСны Π² строку SQL послС Ρ€Π°Π·Β­Π±ΠΎΡ€Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ.

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 3

Команда динамичСского SQL ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 3 прСдставляСт собой запрос с фиксированным количСством ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±Π΅Π· Π½ΠΈΡ…). ВСроятно, Ρ‡Π°Ρ‰Π΅ всСго Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ динамичСского SQL ΠΈΠΌΠ΅Π½Π½ΠΎ этого Ρ‚ΠΈΠΏΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ 4

НаконСц, рассмотрим самый слоТный случай: динамичСский SQL ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 4. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ запрос:

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, ситуации, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ примСнСния ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ 4, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π΄ΠΊΠΎ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

динамичСская ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ SQL Π² ODBC

хотя статичСскиС SQL Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ситуациях, сущСствуСт класс ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π·Π°Ρ€Π°Π½Π΅Π΅. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ элСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ввСсти запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ элСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° отправляСт Π‘Π£Π‘Π” для получСния Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ содСрТимоС этого запроса нСизвСстно программисту ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

ДинамичСскоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, элСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ встроСнных SQL с ΠΈΠΌΠ΅Π½Π΅ΠΌ dynamic SQL. Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ статичСских инструкций SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ТСстко Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, динамичСскиС SQL ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ построСны Π²ΠΎ врСмя выполнСния ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡƒΠ·Π»Π° строки. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π‘Π£Π‘Π” для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ субд Π΄ΠΎΠ»ΠΆΠ½Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π½ доступа Π²ΠΎ врСмя выполнСния для динамичСских SQL инструкций, динамичСскиС SQL ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ статичСскиС SQL. ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, содСрТащСй динамичСскиС инструкции SQL, инструкции dynamic SQL Π½Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠ°ΠΊ Π² статичСском SQL. ВмСсто этого ΠΎΠ½ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π‘Π£Π‘Π”; статичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ SQL Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

самый простой способ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ dynamic SQL β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции execute IMMEDIATE. эта инструкция ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ SQL Π² субд для компиляции ΠΈ выполнСния.

ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· нСдостатков инструкции EXECUTE IMMEDIATE являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ субд Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· пяти шагов ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° SQL ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ инструкции. НакладныС расходы, связанныС с этим процСссом, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ссли ΠΌΠ½ΠΎΠ³ΠΈΠ΅ инструкции Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ динамичСски ΠΈ Π½Π΅ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°, Ссли эти инструкции ΠΏΠΎΡ…ΠΎΠΆΠΈ.

ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ описанной Π²Ρ‹ΡˆΠ΅ ситуации динамичСский SQL ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ выполнСния с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, которая выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° конструируСт ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ SQL Π² Π±ΡƒΡ„Π΅Ρ€Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это дСлаСтся для инструкции EXECUTE IMMEDIATE. ВмСсто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-ΡƒΠ·Π»ΠΎΠ² Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ (?) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° константу Π² любом мСстС тСкста инструкции, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅. Π’ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ вызываСтся ΠΊΠ°ΠΊ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ SQL субд Π² ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ PREPARE, которая Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ субд Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚, провСряСт ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΈ создаСт для Π½Π΅Π΅ ΠΏΠ»Π°Π½ выполнСния. Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ EXECUTE (Π° Π½Π΅ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ EXECUTE IMMEDIATE) для выполнСния инструкции PREPARE ΠΏΠΎΠ·ΠΆΠ΅. ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для инструкции Ρ‡Π΅Ρ€Π΅Π· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, которая называСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ Π΄Π°Π½Π½Ρ‹Ρ… SQL ΠΈΠ»ΠΈ склда.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ EXECUTE, указывая Ρ€Π°Π·Π½Ρ‹Π΅ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ динамичСской инструкции.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½Π΅ совпадаСт со статичСским SQL. Π² статичСском SQL ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ шага ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ SQL инструкции Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π²ΠΎ врСмя компиляции. Π’ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ эти шаги ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния, Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½Π° происходит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ EXECUTE. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСдостатки ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, присущиС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ динамичСских SQL.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

SPBDEV Blog

Как ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ динамичСский SQL Π² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅

ПослС прочтСния этой ΡΡ‚Π°Ρ‚ΡŒΠΈ Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅ основы динамичСского SQL; ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ инструкции Π½Π° основС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ эти сконструированныС инструкции, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ sp_executesql ΠΈ EXECUTE () ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

ВсС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ этого ΡƒΡ€ΠΎΠΊΠ° основаны Π½Π° Microsoft SQL Server Management ΠΈ ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, AdventureWorks ΠΈ WideWorldImporters.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ динамичСского SQL Π² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ пишСм, Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ нСпосрСдствСнно Π² Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ. Π­Ρ‚ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ называСтся статичСским SQL. Он называСтся Ρ‚Π°ΠΊ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ мСняСтся. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ записан, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΎ ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈΡ‚ измСнСнию.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ статичСского SQL:

SELECT JobTitle, Count(BusinessEntityID)

WHERE Year(BirthDate) = 1970

SELECT JobTitle, Count(BusinessEntityID)

WHERE Year(BirthDate) = 1971

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ инструкции, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡŽΠΌΠ΅ JobTitles для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° роТдСния сотрудника. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ большС Π»Π΅Ρ‚ роТдСния, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ большС инструкций. Π§Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π³ΠΎΠ΄ Π½Π° Π»Π΅Ρ‚Ρƒ?

ИмСнно здСсь вступаСт Π² ΠΈΠ³Ρ€Ρƒ динамичСский SQL.

Π—Π°Ρ‚Π΅ΠΌ Π² этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… выполняСтся ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ с использованиСм динамичСского SQL:

DECLARE @birthYear int = 1970

DECLARE @statement NVARCHAR(4000)

SELECT JobTitle, Count(BusinessEntityID)

WHERE Year(BirthDate) = ‘ + CAST(@birthYear as NVARCHAR) +

EXECUTE sp_executesql @statement

SET @birthYear = @birthYear + 1

ДинамичСский SQL Π²Ρ‹Π΄Π΅Π»Π΅Π½ ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ. Π­Ρ‚ΠΎ SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ построСн для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ @birthYear. По ΠΌΠ΅Ρ€Π΅ создания SQL ΠΎΠ½ сохраняСтся Π² @statement. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ выполняСтся с использованиСм sp_executesql, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ объясним Π½ΠΈΠΆΠ΅.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² sp_executesql

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sp_executeslq для выполнСния Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ SQL, хранящСгося Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π€ΠΎΡ€ΠΌΠ° инструкции:

EXECUTE sp_executesql @statement.

Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

DECLARE @statement NVARCHAR(4000)

SET @statement = N’SELECT getdate()’

EXECUTE sp_executesql @statement

Если Π²Ρ‹ запуститС это Π² ΠΎΠΊΠ½Π΅ запроса, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ поняли, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ sp_executeslq, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, вас попросили Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ LineTotal, Π»ΠΈΠ±ΠΎ сумму LineTotal ΠΏΠΎ ProductID для ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² 2011 Π³ΠΎΠ΄Ρƒ.

Π’Π°ΡˆΠ΅ руководство Ρ…ΠΎΡ‚Π΅Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π±Ρ‹Π»ΠΎ написано ΠΊΠ°ΠΊ хранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°. Π₯ранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ @ReturnAverage. Если это истинно, Ρ‚ΠΎ Π²Ρ‹ Π²Π΅Ρ€Π½Π΅Ρ‚Π΅ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС сумму.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ это Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΡƒΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, Π½ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ вСсСло, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎ Π±Ρ‹ слишком ΠΌΠ½ΠΎΠ³ΠΎ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ошибок.

CREATE PROCEDURE uspCalcuateSalesSummaryStatic

IF (@returnAverage = 1)

AVG(SOD.LineTotal) as ResultAvg

FROM Sales.SalesOrderDetail SOD

INNER JOIN Sales.SalesOrderHEader SOH

ON SOH.SalesOrderID = SOD.SalesOrderID

WHERE YEAR(SOH.ShipDate) = 2011

GROUP BY SOD.ProductID

SUM(SOD.LineTotal) as ResultSum

FROM Sales.SalesOrderDetail SOD

INNER JOIN Sales.SalesOrderHEader SOH

ON SOH.SalesOrderID = SOD.SalesOrderID

WHERE YEAR(SOH.ShipDate) = 2011

GROUP BY SOD.ProductID

Π§Ρ‚ΠΎ здСсь являСтся слабым мСстом, Ρ‚Π°ΠΊ это ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я Π²Ρ‹Π΄Π΅Π»ΠΈΠ» ΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ. БущСствуСт Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ Π²Ρ‹Π΄Π΅Π»Π΅Π½ курсивом.

ΠŸΡ€ΠΈ всСй этой избыточности Ρƒ нас Π΅ΡΡ‚ΡŒ прСкрасная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ динамичСский SQL. Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм это!

CREATE PROCEDURE uspCalcuateSalesSummaryDynamic

DECLARE @statement NVARCHAR(4000),

IF (@returnAverage = 1) SET @function = ‘Avg’

ELSE SET @function = ‘Sum’

@function + + ‘(SOD.LineTotal) as Result’ + @function + ‘

FROM Sales.SalesOrderDetail SOD

INNER JOIN Sales.SalesOrderHEader SOH

ON SOH.SalesOrderID = SOD.SalesOrderID

WHERE YEAR(SOH.ShipDate) = 2011

GROUP BY SOD.ProductID’

EXECUTE sp_executesql @statement

Π—Π΄Π΅ΡΡŒ вмСсто Π΄Π²ΡƒΡ… ΠΏΠΎΠ»Π½Ρ‹Ρ… вСрсий SQL, ΠΎΠ΄ΠΈΠ½ для AVG, Π΄Ρ€ΡƒΠ³ΠΎΠΉ для SUM, ΠΌΡ‹ создаСм Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Β«Π½Π° Π»Π΅Ρ‚ΡƒΒ».

ΠžΡ‚Π»Π°Π΄ΠΊΠ° динамичСского SQL

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ интСрСсно, ΠΊΠ°ΠΊ выглядит SQL Π²ΠΎ врСмя выполнСния. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°:

ЗапуститС Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠ΄.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Execute, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π½ΠΈΠΆΠ΅.

ИспользованиС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ достигнСтС этой инструкции, Π½Π°Π²Π΅Π΄ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π½Π° @statement, ΠΈ ΠΊΠΎΠ³Π΄Π° появится подсказка инструмСнта, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ тСкстовый Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

ΠžΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ являСтся ΠΌΠΎΡ‰Π½Ρ‹ΠΌ ΠΈ Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ понимания. Π― Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ‚Π΅Π», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎΠ± этом здСсь.

ИспользованиС sp_executesql с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sp_executesql для задания ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² вашСй инструкции. Π­Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ ваш ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΈΠΌ для чтСния ΠΈ прСдоставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прСимущСства ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ скомпилирован ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ использован ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ:

EXECUTE sp_executesql @statement, @parameterDefinition, @parm1=value1…, @parm2=value2, …

Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ поясним Π΄Π΅Ρ‚Π°Π»ΠΈ.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ устанавливаСм значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², задавая ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ пСрСчислСны Π² порядкС, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ Π² строкС @parameterDefinition.

Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт Π΄Π²Π° числа, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ:

DECLARE @statement NVARCHAR(4000)

DECLARE @parameterDefinition NVARCHAR(4000)

SET @statement = N’SELECT @a + @b’

SET @parameterDefinition = N’@a int, @b int’

Π’Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ части инструкции:

Для этого Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ динамичСски исполняСмый ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ SQL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Ρ†Π΅Π»Ρ‹Π΅ числа. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° устанавливаСтся Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ sp_executesql.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования sp_executesql с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим наш ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ Π΅Π³ΠΎ. ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ТСстко ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ shipDate Π² запросС, ΠΊΠ°ΠΊ ΠΌΡ‹ это сдСлали, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Π²Π΅Π΄Π΅ΠΌ это ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ запрос Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π³ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΡ€ΠΎΠΌΠ΅ 2011 Π³ΠΎΠ΄Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ внСсти это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π½Π°ΡˆΡƒ Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² динамичСский запрос. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ sp_executesql для Π²Ρ‹Π·ΠΎΠ²Π° динамичСского запроса с использованиСм этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

ОбновлСнная хранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° с измСнСниями ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½ΠΈΠΆΠ΅.

CREATE PROCEDURE uspCalcuateSalesSummaryDynamic2

DECLARE @statement NVARCHAR(4000),

IF (@returnAverage = 1) SET @function = ‘Avg’

ELSE SET @function = ‘Sum’

SET @parameterDefinition = ‘@shipDateYear int’

@function + + ‘(SOD.LineTotal) as Result’ + @function + ‘

FROM Sales.SalesOrderDetail SOD

INNER JOIN Sales.SalesOrderHEader SOH

ON SOH.SalesOrderID = SOD.SalesOrderID

WHERE YEAR(SOH.ShipDate) = @shipDateYear

GROUP BY SOD.ProductID’

EXECUTE sp_executesql @statement, @parameterDefinition, @shipDateYear=@shipDate

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это, просто Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ procpackSalesSummaryDynamic2 proc ΠΈΠ· ΠΎΠΊΠ½Π° запросов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

EXECUTE uspCalcuateSalesSummaryDynamic2 1,2011

Если Π²Ρ‹ это сдСлаСтС, Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΎΠ΄Π½ΠΎ прСкрасноС ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ объСдиним @shipDateYear ΠΈ @shipDate Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠœΡ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠΌ @shipDateYear ΠΈΠ· нашСго ΠΊΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ отслСТиваниС ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅:

CREATE PROCEDURE uspCalcuateSalesSummaryDynamic2

DECLARE @statement NVARCHAR(4000),

IF (@returnAverage = 1) SET @function = ‘Avg’

ELSE SET @function = ‘Sum’

SET @parameterDefinition = ‘@shipDate int’

@function + + ‘(SOD.LineTotal) as Result’ + @function + ‘

FROM Sales.SalesOrderDetail SOD

INNER JOIN Sales.SalesOrderHEader SOH

ON SOH.SalesOrderID = SOD.SalesOrderID

WHERE YEAR(SOH.ShipDate) = @shipDate

GROUP BY SOD.ProductID’

EXECUTE sp_executesql @statement, @parameterDefinition, @shipDate

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ инструкция EXECUTE Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Π½Π΅Ρ‚ нСобходимости Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ инструкции SQL @shipDateYear ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ parameter @ shipDate.

Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠΉ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΎΠΉ для чтСния. ΠŸΠΎΡ‚ΠΎΠΊ каТСтся Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ мыслСнно ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ SQL.

Запуск динамичСского SQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ EXECUTE ()

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ EXEC ΠΈΠ»ΠΈ EXECUTE для запуска динамичСского SQL. Π€ΠΎΡ€ΠΌΠ°Ρ‚ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Π’ΠΎΡ‚ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

DECLARE @statement NVARCHAR(4000)

SET @statement = N’SELECT getdate()’

Π’Π°ΠΆΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ @statement Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки. Если Π²Ρ‹ этого Π½Π΅ сдСлаСтС, инструкция EXECUTE ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ @statement, ΠΈ вмСсто запуска динамичСского SQL ΠΎΠ½Π° Ρ€Π΅ΡˆΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

Msg 2812, Level 16, State 62, Line 3

Could not find stored procedure ‘SELECT getdate()’.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π΄Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ подсказку! Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ.

sp_executesql ΠΏΡ€ΠΎΡ‚ΠΈΠ² EXECUTE

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ интСрСсно, Π·Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sp_executesql Π² сравнСнии с EXECUTE. ΠšΠ°ΠΊΠΎΠ²Ρ‹ различия ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ?

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Microsoft Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sp_executesql для запуска динамичСского SQL:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *