[SQL] IN () 절에 SQL 매개 변수를 전달하면 .NET에서 데이터 집합을 입력하여
SQLIN () 절에 SQL 매개 변수를 전달하면 .NET에서 데이터 집합을 입력하여
먼저 사과는이 사이트에 비슷한 질문이 있기 때문에,하지만 그들 중 누구도 직접이 문제에 답하지 않습니다.
임 내가 쿼리 등으로 데이터 집합에 TableAdapter가를 만들 VS 2010 년 데이터 세트를 입력하여 :
SELECT * from Table WHERE ID IN(@IDs)
내가 전화를 이제 경우 : TableAdapter.Fill (MyDataTable, "1,2,3") 오류가 VS가 INT를 입력 1,2,3을 변환 할 수 없다는 발생합니다. 그럴 수 있지.
그럼 내가 매개 변수 컬렉션 문자열 (즉, @IDs) 유형의 매개 변수를 변경하기로 결정. 다시 시도 - 여전히 같은 오류 메시지가.
그래서이 형식화 된 데이터 집합 내 "1,2,3"매개 변수를 받아 들일 수있는 방법은 무엇입니까? 내가 쉽게 불과 5 또는 매개 변수 있도록를 작성하고 개별적으로 통과하지만, 수백 어떤이있는 경우 수 있도록 지금이 순간 난 단지, 전달하는 몇 가지 매개 변수가? 내 쉼표로 채우기 () 메소드는 매개 변수를 분리 호출 할 수있는 방법이 있습니까?
(내가 문을 작성하고 실행하는 동적 SQL을 사용할 수 있지만 내게는 예를 들어,의 ReportViewer에서 사용하기 위해 내 입력 된 데이터 집합을 유지 할 수 있도록 다른 방법이 있는지 선호 알고 / bindingsources)
해결법
-
==============================
1.이 방법으로 값 목록에 대해 하나의 매개 변수를 사용할 수 없습니다. 그러나 당신이 원하는 것을 달성하기 위해 데이터베이스 고유의 방법이 될 수있다. 예를 들어, SQL 서버 2005 이상 당신은 당신의 문자열 매개 변수를 분할하기 위해 테이블 반환 함수를 만들 수 있습니다, 같은 :
이 방법으로 값 목록에 대해 하나의 매개 변수를 사용할 수 없습니다. 그러나 당신이 원하는 것을 달성하기 위해 데이터베이스 고유의 방법이 될 수있다. 예를 들어, SQL 서버 2005 이상 당신은 당신의 문자열 매개 변수를 분할하기 위해 테이블 반환 함수를 만들 수 있습니다, 같은 :
CREATE FUNCTION dbo.F_Split ( @InputString VARCHAR(MAX) ,@Separator VARCHAR(MAX) ) RETURNS @ValueTable TABLE (Value VARCHAR(MAX)) AS BEGIN DECLARE @SeparatorIndex INT, @TotalLength INT, @StartIndex INT, @Value VARCHAR(MAX) SET @TotalLength=LEN(@InputString) SET @StartIndex = 1 IF @Separator IS NULL RETURN WHILE @StartIndex <= @TotalLength BEGIN SET @SeparatorIndex = CHARINDEX(@Separator, @InputString, @StartIndex) IF @SeparatorIndex > 0 BEGIN SET @Value = SUBSTRING(@InputString, @StartIndex, @SeparatorIndex-@StartIndex) SET @StartIndex = @SeparatorIndex + 1 END ELSE BEGIN Set @Value = SUBSTRING(@InputString, @StartIndex, @TotalLength-@StartIndex+1) SET @StartIndex = @TotalLength+1 END INSERT INTO @ValueTable (Value) VALUES (@Value) END RETURN END
다음과 같이 다음을 사용합니다 :
SELECT * from Table WHERE ID IN (SELECT CAST(Value AS INT) FROM F_Split(@IDs, ','))
-
==============================
2.나는 문자열을 사용하여에 대한 해결 방법은 SQL 방식의 개념을 "포함"시도 :
나는 문자열을 사용하여에 대한 해결 방법은 SQL 방식의 개념을 "포함"시도 :
귀하의 경우, SQL을 변경 -
기발한:
지다:
-
==============================
3.SQL Server 2008에서는 테이블 반환 매개 변수라는 기능이 있습니다
SQL Server 2008에서는 테이블 반환 매개 변수라는 기능이 있습니다
당신이 필요 그래서
우리가 우리 자신에 의해 그것을 해결하기 위해 필요 불행하게도 표 어댑터 디자이너는 SqlParameter.TypeName 인수를 지원하지 않습니다. 목표는 생성 된 TableAdapter에 클래스의 CommandCollection 속성을 수정하는 것입니다. 당신이 TableAdapter에 또는 예를 들어, 사용 반사 그것을 조정할하기를 도출해야 불행하게도,이 속성은, 보호됩니다. 여기서 파생 클래스의 예이다 :
public class MyTableAdapter2 : MyTableAdapter { public MyTableAdapter2() { SqlCommand[] cmds = base.CommandCollection; // here, the IDS parameter is index 0 of command 1 // you'll have to be more clever, but you get the idea cmds[1].Parameters[0].TypeName = "MyIntArray"; } }
그리고 이것은이 메서드를 호출 할 수있는 방법입니다 :
MyTableAdapter t = new MyTableAdapter2(); // create the TVP parameter, with one column. the name is irrelevant. DataTable tvp = new DataTable(); tvp.Columns.Add(); // add one row for each value DataRow row = tvp.NewRow(); row[0] = 1; tvp.Rows.Add(row); row = tvp.NewRow(); row[0] = 2; tvp.Rows.Add(row); row = tvp.NewRow(); row[0] = 3; tvp.Rows.Add(row); t.Fill(new MyDataTable(), tvp);
-
==============================
4.PostgreSQL의는 IN과 Npgsql 함께 사용할 수있는 배열의 개념을 가지고 있기 때문에, 필자가 아는 유일한 데이터베이스가 IN 절에서 .NET에서 매개 변수를 사용할 수 있습니다 PostgreSQL은 배열을 할 수 있습니다 (또는를 IEnumerable
) 매개 변수입니다. PostgreSQL의는 IN과 Npgsql 함께 사용할 수있는 배열의 개념을 가지고 있기 때문에, 필자가 아는 유일한 데이터베이스가 IN 절에서 .NET에서 매개 변수를 사용할 수 있습니다 PostgreSQL은 배열을 할 수 있습니다 (또는를 IEnumerable
) 매개 변수입니다. 다른 데이터베이스를 사용하면 하나 구조는 SQL에, 또는 다음 0 또는-이상의 매개 변수로 변환을하고 그들에 작용하는 데이터베이스 프로 시저에 문자열을 전달합니다.
-
==============================
5.@Joe는 권리입니다.
@Joe는 권리입니다.
또는 당신은 그렇게 foreach는 루프를 사용할 수 있습니다.
뭔가 같은 :
int[] arr = new int[3]; arr[0] = "1"; arr[1] = "2"; arr[2] = "3"; foreach(vat data in arr) { //Do your Code here // var MyDatatable = obj.GetDatabyID(data); TableAdapter.Fill(MyDataTable); }
문안 인사
-
==============================
6.또한 ID를 매개 변수의 목록을 만들 수 있습니다 그래서 대신 @IDs를 사용하면 사용 ID1 @, ID2 @, ID3 @ 등
또한 ID를 매개 변수의 목록을 만들 수 있습니다 그래서 대신 @IDs를 사용하면 사용 ID1 @, ID2 @, ID3 @ 등
var sql = "SELECT * from Table WHERE ID IN (" + getKeys(values.Count) + ")";
그리고 getKeys는 (카운트) 같은 것을 할 :
var result = string.Empty; for (int i = 0; i < count; i++) { result += ", @ID" + i; } return string.IsNullOrEmpty(result) ? string.Empty : result.Substring(1);
그리고 마지막으로, 매개 변수를 추가 :
foreach (int i = 0; i < values.Count; i++) { cmd.Parameters.Add(new SqlParameter("@ID" + i, SqlDbType.VarChar) { Value = values[i]}); }
-
==============================
7.또한 저장 프로 시저에 매개 변수 목록을 전달하기 위해 XML을 사용할 수 있습니다 :
또한 저장 프로 시저에 매개 변수 목록을 전달하기 위해 XML을 사용할 수 있습니다 :
1) Visual Studio에서 :
새로운 TableAdapter에를 만들고 단일 레코드를 얻기 위해 형식화 된 데이터 집합을 만듭니다
SELECT * FROM myTable WHERE (ID = @ID)
2)에서 SQL 서버 관리자 :
당신의 입력 데이터 세트와 같은 선택 필드가있는 저장 프로 시저를 만들기 :
CREATE PROCEDURE [dbo].[usrsp_GetIds] @paramList xml = NULL AS SET NOCOUNT ON; /* Create a temp table to hold paramaters list. Parse XML string and insert each value into table. Param list contains: List of ID's */ DECLARE @tblParams AS TABLE (ID INT) INSERT INTO @tblParams(ID) SELECT XmlValues.ID.value('.', 'INT') FROM @paramList.nodes('/params/value') AS XmlValues(ID) /* Select records that match ID's in param list: */ SELECT * FROM myTable WHERE ID IN ( SELECT ID FROM @tblParams )
3) Visual Studio에서 :
당신의 TableAdapter에에 새 쿼리를 추가, usrsp_GetIds 위에서 만든 저장 프로 시저를 선택하고 그것을 FillBy_Ids 이름을 지정합니다. 이 명령을 생성합니다 :
TableAdapter.FillBy_Ids(@paramList)
4) Visual Studio에서 :
당신의 .NET 코드에서 XML을 문자열 배열을 변환하는 유틸리티 함수를 만들 :
''' <summary> ''' Converts an array of strings to XML values. ''' </summary> ''' <remarks>Used to pass parameter values to the data store.</remarks> Public Shared Function ConvertToXML(xmlRootName As String, values() As String) As String 'Note: XML values must be HTML encoded. Dim sb As New StringBuilder sb.AppendFormat("<{0}>", HttpUtility.HtmlEncode(xmlRootName)) For Each value As String In values sb.AppendLine() sb.Append(vbTab) sb.AppendFormat("<value>{0}</value>", HttpUtility.HtmlEncode(value)) Next sb.AppendLine() sb.AppendFormat("</{0}>", xmlRootName) Return sb.ToString End Function
사용 예 :
매개 변수로 문자열 목록을 전달하여 강력한 형식의 기능을 사용하여 데이터 테이블을 채 웁니다
'Create a list of record IDs to retrieve: Dim ids as New List(of String) ids.Add(1) ids.Add(2) ids.Add(3) 'Convert the list of IDs to an XML string: Dim paramsXml As String = ConvertToXML("params", ids.ToArray) 'Get the records using standard DataTable & TableAdapter methods: Using myDT As New MyDataTable Using myTA As New MyTableAdapter myTA.FillBy_Ids(myDT, paramsXml) For Each row In myDT 'do stuff: Next End Using End Using
-
==============================
8.나는 거짓에 ClearBeforeFill 속성을 설정하고, foreach 루프에서 TableAdapter가를 작성하여이 문제를 해결 할 수 있었다.
나는 거짓에 ClearBeforeFill 속성을 설정하고, foreach 루프에서 TableAdapter가를 작성하여이 문제를 해결 할 수 있었다.
List<string> aList = new List<string>(); aList.Add("1"); aList.Add("2"); aList.Add("3"); yourTableAdapter.ClearBeforeFill = true; yourTableAdapter.Fill(yourDataSet.yourTableName, ""); //clears table foreach (string a in aList) { yourTableAdapter.ClearBeforeFill = false; yourTableAdapter.Fill(yourDataSet.yourTableName, a); } yourTableAdapter.Dispose();
from https://stackoverflow.com/questions/5401641/passing-a-sql-parameter-to-an-in-clause-using-typed-datasets-in-net by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어디 문에서 SQL을 사용하여 별칭 (0) | 2020.04.26 |
---|---|
[SQL] 잠금 장치의 총 수는 로크 테이블 크기를 초과 (0) | 2020.04.26 |
[SQL] SQL 쿼리는 급여 테이블에서 N 번째 가장 높은 급여를 찾을 수 (0) | 2020.04.26 |
[SQL] IF는 조건이 PLSQL 작동하지 EXISTS (0) | 2020.04.26 |
[SQL] SQL Server 관리 Studio에서 스크립트를 생성 (0) | 2020.04.26 |