我在C#中使用t-sql select查詢時遇到了一些麻煩。查詢如下:當使用IN時,T-SQL Select語句返回零行
@"SELECT * FROM
(SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row_number
FROM [mytable]) t0
WHERE row_number BETWEEN @skip and @take
AND
uploadDate IN (@years)
AND NOT photoId IN (@shownPhotos)
ORDER BY NEWID()";
cmd.Parameters.Add("@skip", SqlDbType.Int).Value = skip;
cmd.Parameters.Add("@take", SqlDbType.Int).Value = take;
cmd.Parameters.Add("@shownPhotos", SqlDbType.VarChar).Value = shownPhotos;
cmd.Parameters.Add("@years", SqlDbType.VarChar).Value = years;
該方法採用四個參數:跳過計數,取數,shownPhotos(其中包含這些年來,以顯示從照片逗號分隔字符串)(其中包含有照片的身份證逗號分隔字符串),年
所以基本上我希望它從我的數據庫返回的照片匹配任何從逗號分隔的字符串中的任何年份,並沒有顯示。
問題(我認爲)是我的參數是字符串,所以它們被解釋爲'1234,567,890'和'2011,2012'。在SQL服務器管理工具中運行查詢時,如果沒有,它工作正常。
任何人都有解決這個問題嗎? :-)
非常感謝!
更新代碼:
// Create datatables
DataTable yearsTable = new DataTable();
yearsTable.Columns.Add("YearID", typeof(string));
yearsTable.Columns.Add("Year", typeof(string));
foreach(string year in years.Split(','))
yearsTable.Rows.Add(new object[] { year, year });
using (var conn = new SqlConnection(GlobalSettings.DbDSN))
{
conn.Open();
using (var cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText =
@"SELECT * FROM
(SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row_number
FROM [mytable]) t0
WHERE row_number BETWEEN @skip and @take
AND
uploadedDate IN (@years)
ORDER BY NEWID()";
SqlParameter skipParam = cmd.Parameters.AddWithValue("@skip", skip);
skipParam.SqlDbType = SqlDbType.Int;
SqlParameter takeParam = cmd.Parameters.AddWithValue("@take", take);
takeParam.SqlDbType = SqlDbType.Int;
SqlParameter yearsParam = cmd.Parameters.AddWithValue("@years", yearsTable);
yearsParam.SqlDbType = SqlDbType.Structured;
yearsParam.TypeName = "dbo.MyTableType";
var reader = cmd.ExecuteReader();
}
我喜歡Marc的解決方案,但問題是我在這裏使用字符串而不是int: - /所以我想這不是一個選項? – bomortensen
@bomortenson不是問題 - 使用字符串[]而不是int [] - 它會正常工作。 –
哦,所以我必須安裝精簡版來做到這一點? :) – bomortensen