Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

sp_executesql с израз "IN".

Причината да не работи е, че @P1 се третира като една единствена стойност.

напр. когато @Code е X101,B202, тогава заявката просто се изпълнява като:SELECT * FROM Table WHERE RegionCode IN ('X101,B202')Така че търси RegionCode със стойността, която се съдържа в @P1. Дори когато включите единични кавички, всичко това означава, че стойността, която търси в RegionCode, се очаква да съдържа тези единични кавички.

Трябва действително да свържете променливата @Code в текста на командата @Cmd sql, за да може тя да работи по начина, по който си мислите:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Очевидно обаче това просто ви отваря към SQL инжектиране, така че трябва да сте много внимателни, ако използвате този подход, за да сте сигурни, че се предпазвате от това.

Има алтернативни начини за справяне с тази ситуация, при която искате да подадете динамичен списък със стойности за търсене.

Разгледайте примерите в моя блог за 2 подхода, които бихте могли да използвате с SQL Server 2005. Единият включва предаване на CSV списък във формата „Стойност1, Стойност2, Стойност3“, който след това разделяте на променлива TABLE с помощта на дефинирана от потребителя функция (има много споменавания за това подход, ако направите бързо търсене в Google или този сайт). След като се разделите, след това присъединявате тази TABLE променлива към основната си заявка. Вторият подход е да се предаде XML blob, съдържащ стойностите, и да се използва вградената XML функционалност на SQL Server. И двата подхода са демонстрирани с показатели за ефективност в тази връзка и не изискват динамичен SQL.

Ако използвате SQL Server 2008, параметрите на стойността на таблицата биха били правилният начин - това е третият подход, който демонстрирам в тази връзка, който излиза най-добре.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е Connect Timeout в низа за свързване на sql сървър?

  2. Не може да се свърже с SQLServer база данни в Java приложение

  3. Как да шифровате всички съществуващи съхранени процедури на база данни

  4. Съхранените процедури заключват ли таблици/редове?

  5. Как да създадете уникално ограничение само върху частта от датата на дата и час?