我有一些代码生成一组我想从数据库表中删除的主键值.
long[] keysToDelete = { 0, 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)
我想使用PreparedStatement执行相当于
DELETE FROM MyTable WHERE myPrimaryKey IN (0, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
知道怎么样?
我有一个非常大的数据库,我正在使用,我需要知道如何选择一组没有任何实际模式的id.这是我到目前为止的代码段:
longIdList = [1, 3, 5 ,8 ....................................]
for id in longIdList
sql = "select * from Table where id = %s" %id
result = cursor.execute(sql)
print result.fetchone()
Run Code Online (Sandbox Code Playgroud)
我在想,必须有一个更快的方法来做到这一点......我的意思是我的脚本需要搜索一个拥有超过400万id的数据库.有没有办法可以使用select命令一次性抓取它们.我可以使用带有id列表的where语句吗?谢谢
在SO上处理一个不同的问题之后,我偶然发现了递归的CTE,表面上似乎是解决"将csv拆分为表行"问题的一种相当简单的方法.
我把这个例子放在一起
DECLARE @InputString varchar(255) = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z'
SELECT @InputString = @InputString + ','
;
with MyCTE(x,y)
as
(
SELECT
x = SUBSTRING(@InputString,0,PATINDEX('%,%',@InputString)),
y = SUBSTRING(@InputString,PATINDEX('%,%',@InputString)+1,LEN(@InputString))
UNION ALL
SELECT
x = SUBSTRING(y,0,PATINDEX('%,%',y)),
y = SUBSTRING(y,PATINDEX('%,%',y)+1,LEN(y))
FROM
MyCTE
WHERE
SUBSTRING(y,PATINDEX('%,%',y)+1,LEN(y)) <> '' OR
SUBSTRING(y,0,PATINDEX('%,%',y)) <> ''
)
SELECT x FROM MyCTE
OPTION (MAXRECURSION 2000);
GO
Run Code Online (Sandbox Code Playgroud)
这真是个坏主意吗?对于像这样的递归查询,SQL的开销是多少,以及这种方法的潜在缺陷是什么.
顺便说一句,我想这样的想法/技术很可能被利用来解决这个问题的其他问题.
我正在传递一长串employeeId,employeeIdlist并将它们分成一个List.使用此列表我将向查询添加参数.我收到以下错误
{"必须声明标量变量\"@ EmployeeId \"."}
public List<versionInfo> GetVersion(string employeeIdlist)
{
DbHelper helper = new DbHelper();
List<versionInfo> empVerInfo = new List<versionInfo>();
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand getVersion = new SqlCommand())
{
getVersion.Connection = conn;
getVersion.CommandText = @"SELECT EmployeeId,Version
FROM [dbo].[EmployeeVersion]
WHERE EmployeeId in (@EmployeeId)";
getVersion.CommandType = CommandType.Text;
List<int> empIds = employeeIdlist.Split(',').Select(int.Parse).ToList();
StringBuilder sb = new StringBuilder();
int i = 0;
foreach (var emp in empIds)
{
// IN clause
sb.Append("@EmployeeId" + i.ToString() + ",");
// …Run Code Online (Sandbox Code Playgroud) 对不起,我不知道如何很好地标题.我想在sql中选择一些特定列是一组字符串的记录.
例子.我有一个表学生,并且有列ID和名称.ID有1,2,3,4,5,6的记录.NAme具有A,B,C,D,E,F.
我想返回C,D,E WHERE ID = [3,4,5].
我试过了
SELECT FROM student WHERE ID=2,3,4
Run Code Online (Sandbox Code Playgroud)
它给出了错误ID =2,3,4 ='2,3,4',它将ID作为单个列读取.我很迷惑.
同样在我的例子中,ID set在storedprocedure变量中返回.就像@ID一样
SELECT * FROM STUDENT WHERE ID=@ID
Run Code Online (Sandbox Code Playgroud)
上面的@ID是一个包含集合{1,2,3}的字符串类型的变量.请任何帮助将不胜感激.
因此,我尝试在本地托管的网页上练习 SQL 注入。我对 SQL 很陌生,尤其是 SQL 注入。我已经做了一些研究,将新条目注入表中,但是当我尝试执行时,它似乎不起作用。
首先,我的网页是登录的。我有用户名和密码(显然)并且可以在不附加任何 SQL 注入的情况下登录。但是当我将注入代码添加到用户名框中时,它不起作用。例子:
username: admin'; insert into hall values (3,'https://google.com','Google'); --
password: 123321
Run Code Online (Sandbox Code Playgroud)
在我的大厅表中,有 3 个条目:id、链接、目的地。ID 是一个整数,链接和目标是 varchars。
我需要做什么才能成功注入并将此条目添加到数据库中?是需要输入正确的用户名和密码,还是只输入用户名,还是其他什么?
我有一个存储过程,需要按以逗号分隔的列表(即'1,2,3')传递的ID列表进行过滤。
我想应用WHERE IN将与这些ID匹配的子句,但仅在变量包含任何内容(IS NOT NULL AND <> '')的情况下。
这是问题的简化提琴:http : //sqlfiddle.com/#!18/5f6be/1
目前,它适用于单个和多个ID。但是,通过时'',NULL它应该返回所有内容,但不返回任何内容。
出现CTE和分页的内容是有原因的,请提供一个不会改变它的解决方案。