복붙노트

[SQL] SQL은 : 저장 프로 시저 절에 어떻게 값을 전달합니다

SQL

SQL은 : 저장 프로 시저 절에 어떻게 값을 전달합니다

내가 선택하고 매개 변수로 저장 프로 시저에 전달되는 일부 사용자 ID에 대한 사용자 테이블에서 사용자 레코드를 반환하는 SQL Server 2005의 저장 프로 시저를 작성합니다.

이걸 어떻게 할까?

문자열은 쉼표로 구분 I로 사용자 ID를 전달할 수있다. 그래서 나는를 사용할 수있는

select * 
from users 
where userid in (userids)

예를 들면 : 나는 ID의 5,6,7,8,9에 대한 기록을 선택합니다

어떻게 저장 프로 시저를 작성하는?

해결법

  1. ==============================

    1.SQL Server 2005의 경우, 방법 (그는 또한 SQL Server 2000의 다른 기사가 있습니다) SQL Server 2005에서리스트와 배열에 대처하는 몇 가지 기술을 보여주는 SQL Server 2005의 문서 ERLAND Sommarskog의 훌륭한 배열과 목록을 확인하십시오.

    SQL Server 2005의 경우, 방법 (그는 또한 SQL Server 2000의 다른 기사가 있습니다) SQL Server 2005에서리스트와 배열에 대처하는 몇 가지 기술을 보여주는 SQL Server 2005의 문서 ERLAND Sommarskog의 훌륭한 배열과 목록을 확인하십시오.

    당신은 SQL Server 2008로 업그레이드 할 수 있다면, 당신은 "테이블 반환 매개 변수"라는 새로운 기능을 사용할 수 있습니다 :

    첫째, 사용자 정의 테이블 형식을 만들

    CREATE TYPE dbo.MyUserIDs AS TABLE (UserID INT NOT NULL)
    

    둘째, 매개 변수로 저장 프로 시저에 해당 테이블 유형을 사용 :

    CREATE PROC proc_GetUsers @UserIDTable MyUserIDs READONLY 
    AS
    SELECT * FROM dbo.Users
        WHERE userid IN (SELECT UserID FROM @UserIDTable)
    

    여기에서 자세한 내용을 참조하십시오.

    즙을 짜고 난 찌꺼기

  2. ==============================

    2.그냥 작동이처럼 사용

    그냥 작동이처럼 사용

    Create procedure sp_DoctorList 
    @userid varchar(100)
    as 
    begin
    exec ('select * from doctor where userid in ( '+ @userid +' )')
    end
    
  3. ==============================

    3.당신은 동적 SQL을 사용할 수 있습니다. 변수를 통해 SQL을 SP에 문에 전달하고, SQL에서 쿼리로를 연결할 및 sp_execute 두의 SQL을 사용하여 실행

    당신은 동적 SQL을 사용할 수 있습니다. 변수를 통해 SQL을 SP에 문에 전달하고, SQL에서 쿼리로를 연결할 및 sp_execute 두의 SQL을 사용하여 실행

    create procedure myproc(@clause varchar(100)) as 
    begin
      exec sp_executesql 'select * from users where userid in ( ' + @clause +' )'
    end
    
  4. ==============================

    4.이 내 이전의 대답을 참조

    이 내 이전의 대답을 참조

    이 최고의 소스입니다 :

    http://www.sommarskog.se/arrays-in-sql.html

    분할 함수를 작성하고, 같이 사용할 수 :

    SELECT
        *
        FROM YourTable  y
        INNER JOIN dbo.splitFunction(@Parameter) s ON y.ID=s.Value
    

    나는 숫자 표 방식을 선호

    작업이 방법, 당신이 한 번 테이블 설정을 수행해야합니다

    SELECT TOP 10000 IDENTITY(int,1,1) AS Number
        INTO Numbers
        FROM sys.objects s1
        CROSS JOIN sys.objects s2
    ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
    

    [숫자 테이블이 설정되면,이 기능을 만듭니다

    CREATE FUNCTION [dbo].[FN_ListToTable]
    (
         @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
        ,@List     varchar(8000)--REQUIRED, the list to split apart
    )
    RETURNS TABLE
    AS
    RETURN 
    (
    
        ----------------
        --SINGLE QUERY-- --this will not return empty rows
        ----------------
        SELECT
            ListValue
            FROM (SELECT
                      LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                      FROM (
                               SELECT @SplitOn + @List + @SplitOn AS List2
                           ) AS dt
                          INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                      WHERE SUBSTRING(List2, number, 1) = @SplitOn
                 ) dt2
            WHERE ListValue IS NOT NULL AND ListValue!=''
    
    );
    GO 
    

    이제 쉽게 테이블에 CSV 문자열을 분할과에 가입 할 수 있습니다 :

    select * from dbo.FN_ListToTable(',','1,2,3,,,4,5,6777,,,')
    

    산출:

    ListValue
    -----------------------
    1
    2
    3
    4
    5
    6777
    
    (6 row(s) affected)
    

    귀하는 절차로 CSV 문자열에 전달하고, 지정된 ID에 대한 행만을 처리 할 수 ​​있습니다 :

    SELECT
        y.*
        FROM YourTable y
            INNER JOIN dbo.FN_ListToTable(',',@GivenCSV) s ON y.ID=s.ListValue
    
  5. ==============================

    5.T-SQL을 가정하면,이 좋은 기능을 사용할 수 있습니다 (즉, 반환 테이블).

    T-SQL을 가정하면,이 좋은 기능을 사용할 수 있습니다 (즉, 반환 테이블).

    DROP FUNCTION sp_ConvertStringToTable
    GO
    CREATE FUNCTION sp_ConvertStringToTable(@list ntext)
          RETURNS @tbl TABLE (Position INT IDENTITY(1, 1) NOT NULL,
                              Value INT NOT NULL) AS
       BEGIN
          DECLARE @pos      int,
                  @textpos  int,
                  @chunklen smallint,
                  @str      nvarchar(4000),
                  @tmpstr   nvarchar(4000),
                  @leftover nvarchar(4000)
    
          SET @textpos = 1
          SET @leftover = ''
          WHILE @textpos <= datalength(@list) / 2
          BEGIN
             SET @chunklen = 4000 - datalength(@leftover) / 2
             SET @tmpstr = ltrim(@leftover + substring(@list, @textpos, @chunklen))
             SET @textpos = @textpos + @chunklen
    
             SET @pos = charindex(' ', @tmpstr)
             WHILE @pos > 0
             BEGIN
                SET @str = substring(@tmpstr, 1, @pos - 1)
                INSERT @tbl (Value) VALUES(convert(int, @str))
                SET @tmpstr = ltrim(substring(@tmpstr, @pos + 1, len(@tmpstr)))
                SET @pos = charindex(' ', @tmpstr)
             END
    
             SET @leftover = @tmpstr
          END
    
          IF ltrim(rtrim(@leftover)) <> ''
             INSERT @tbl (Value) VALUES(convert(int, @leftover))
    
          RETURN
       END   
    GO
    

    이런 식으로:

    SELECT * FROM Users 
    WHERE userid IN 
    ( SELECT Value FROM sp_ConvertStringToTable('1 2 3') )
    

    쉼표 공간이 사람을 분리 대신 문자열을 분리하면 작업에 저장된 기능을 변경할 수 있습니다.

    당신이 /가 저장 기능을 사용할 수 없습니다하지 않을 경우 당신은 필요한 저장 프로 시저 내부 그것의 코드를 포함 할 수 있습니다.

    편집 :이 문자열 연결에 비해 믿을 수 없을만큼 더 성능이 좋은 것입니다.

  6. ==============================

    6.나를 위해이이 작품을 시도

    나를 위해이이 작품을 시도

    DECLARE @InClause NVARCHAR(100)
    SET @InClause = 'tom,dick,harry'
    DECLARE @SafeInClause NVARCHAR(100)
    SET @SafeInClause = ',' + @InClause + ',' 
    SELECT * FROM myTable WHERE PATINDEX(',' + myColumn + ',', @SafeInClause) > 0
    
  7. ==============================

    7.신속하고 더러운 ..

    신속하고 더러운 ..

    CREATE PROCEDURE SelectUsers (@UserIds VARCHAR(8000))
    AS
    SELECT * FROM Users 
    WHERE userid IN (SELECT CONVERT(VARCHAR(8000), value) FROM STRING_SPLIT(@UserIds, ','))
    
    EXEC SelectUsers @UserIds = 'a1b2,c3d4,e5f6'
    
  8. ==============================

    8.당신은 또한 대신 IN의 FIND_IN_SET를 사용할 수 있습니다. 아래의 쿼리를 참조하십시오

    당신은 또한 대신 IN의 FIND_IN_SET를 사용할 수 있습니다. 아래의 쿼리를 참조하십시오

    create procedure myproc(IN in_user_ids varchar(100)) 
    begin
       select * from users where FIND_IN_SET(userid, in_user_ids);
    end
    
  9. from https://stackoverflow.com/questions/1525126/sql-in-clause-in-stored-procedurehow-to-pass-values by cc-by-sa and MIT license