显然,以下代码不会按预期打印任何内容.我确信这与我尝试将项目列表放入的事实有关@namelist.显然,它不仅仅是文本替代品.
我怎么解决这个问题?谢谢
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = @"select column_name, table_name from information_schema.columns where table_name in (@namelist)";
cmd.Parameters.AddWithValue("@namelist", "'tableOne', 'tableTwo'");
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var a = reader[0];
Console.WriteLine(a);
}
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法将值数组作为SQL Server 2005的单个参数传递给SP的IN部分?
例如:从MyTable中选择*ID IN(@MyValueArray)
今天早些时候我在这个问题上做了一点傻瓜.问题是使用SQL Server,正确的答案涉及添加一个HAVING子句.我犯的最初错误是认为SELECT语句中的别名可以在HAVING子句中使用,这在SQL Server中是不允许的.我犯了这个错误是因为我认为SQL Server与MySQL有相同的规则,它允许在HAVING子句中使用别名.
这让我很好奇,我在Stack Overflow和其他地方探索过,发现了一堆材料,解释了为什么在两个相应的RDBMS上强制实施这些规则.但我没有找到解释在该条款中允许/禁止别名的性能影响的解释HAVING.
举一个具体的例子,我将复制上述问题中出现的查询:
SELECT students.camID, campus.camName, COUNT(students.stuID) as studentCount
FROM students
JOIN campus
ON campus.camID = students.camID
GROUP BY students.camID, campus.camName
HAVING COUNT(students.stuID) > 3
ORDER BY studentCount
Run Code Online (Sandbox Code Playgroud)
在HAVING子句中使用别名而不是重新指定COUNT?的性能影响是什么?这个问题可以在MySQL中直接回答,希望有人可以深入了解SQL中如果支持该HAVING子句中的别名会发生什么.
这是一个罕见的实例,可以用MySQL和SQL Server标记SQL问题,所以在阳光下享受这一刻.
我有一个类似StackOverflow的标记系统,用于我正在处理的数据库.我正在编写一个存储过程,该过程根据WHERE子句中未确定数量的标记查找结果.可以有0到10个标签之间的任何位置来过滤结果.例如,用户可能正在搜索标记为"apple","orange"和"banana"的项目,并且每个结果必须包含所有3个标记.我的查询变得更加复杂,因为我还在处理标记的交叉引用表,但出于这个问题的目的,我不会讨论.
我知道我可以做一些字符串操作并为exec()函数提供一个查询来处理这个问题,但我宁愿不解决与动态SQL相关的性能问题.我认为最好是SQL缓存存储过程的查询计划.
在这种情况下,您使用了哪些技术来避免动态SQL?
根据大众需求,这是我正在使用的查询:
SELECT ft.[RANK], s.shader_id, s.page_name, s.name, s.description, s.download_count, s.rating, s.price FROM shader s
INNER JOIN FREETEXTTABLE(shader, *, @search_term) AS ft ON s.shader_id = ft.[KEY]
WHERE EXISTS(SELECT tsx.shader_id FROM tag_shader_xref tsx INNER JOIN tag t ON tsx.tag_id = t.tag_id WHERE tsx.shader_id = s.shader_id AND t.tag_name = 'color')
AND EXISTS(SELECT tsx.shader_id FROM tag_shader_xref tsx INNER JOIN tag t ON tsx.tag_id = t.tag_id WHERE tsx.shader_id = s.shader_id AND t.tag_name = 'saturation')
ORDER BY ft.[RANK] DESC
Run Code Online (Sandbox Code Playgroud)
这是功能性但硬编码.你会看到我设置它来寻找'颜色'和'饱和度'标签.
我在ADO.NET中手动编写事务.我正在努力的例子重用了SqlCommand这个好主意.
但是,我在命令中添加了参数.
我的问题是:在下面的代码中,是否command.Parameters.Clear()正确?或者我做错了吗?
using (var connection = new SqlConnection(EomAppCommon.EomAppSettings.ConnStr))
{
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
SqlCommand command = connection.CreateCommand();
command.Transaction = transaction;
try
{
foreach (var itemIDs in this.SelectedItemIds)
{
command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)";
// IS THE FOLLOWING CORRECT?
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@batchID", batchID));
command.Parameters.Add(new SqlParameter("@itemIDs", itemIDs));
command.ExecuteNonQuery();
}
transaction.Commit();
}
catch (Exception ex)
{
MessageBox.Show("Failed to update payment batches, rolling back." + ex.Message);
try
{
transaction.Rollback();
}
catch …Run Code Online (Sandbox Code Playgroud) 这里有一个类似的问题,但实际上并没有回答这个问题.
请注意,这实际上是更大,更复杂的查询的一部分,所以我需要使用普通的sql而不是光滑的提升嵌入.像下面这样的东西会很好:
val ids = List(2,4,9)
sql"SELECT * FROM coffee WHERE id IN ($ids)"
Run Code Online (Sandbox Code Playgroud) 我正在将几个硬编码的查询转换为应用程序并立即构建到参数化查询.我遇到一个特定查询的问题,它有一个in子句:
UPDATE TABLE_1 SET STATUS = 4 WHERE ID IN (1, 14, 145, 43);
Run Code Online (Sandbox Code Playgroud)
第一个参数很简单,因为它只是一个普通的参数:
MySqlCommand m = new MySqlCommand("UPDATE TABLE_1 SET STATUS = ? WHERE ID IN (?);");
m.Parameters.Add(new MySqlParameter("", 2));
Run Code Online (Sandbox Code Playgroud)
但是,第二个参数是一个整数列表,表示需要更新的行的ID.如何传递单个参数的整数列表?或者,您将如何设置此查询,以便您不必在每次调用它时完全构建它,并且可以防止SQL注入攻击?
可能重复:
参数化SQL IN子句?
假设我有一个学校的表,其中school_name,school_enrolment
作为我的计划的输入,有人键入他们希望看到注册的学校列表.而不是生成如下的SQL查询:
SELECT * FROM school_table
WHERE
school_name = 'program_input_1' or school_name = 'program_input_2' or school_name = 'program_input_3'
Run Code Online (Sandbox Code Playgroud)
做某事是可能的还是直截了当的
SELECT * from school_table
WHERE
school name in [array of program inputs]
Run Code Online (Sandbox Code Playgroud)
作为一种更清洁的写作方式?
该程序在C#中,我正在尝试传递List<string>一个参数.
List<string> names = new List<string>{"john", "brian", "robert"};
Run Code Online (Sandbox Code Playgroud)
在纯SQL中,查询将如下所示:
DELETE FROM Students
WHERE name = 'john' or name = 'brian' or name = 'robert'
Run Code Online (Sandbox Code Playgroud)
在C#代码中运行SQL命令时,我知道正确的方法是使用参数而不是将所有内容连接成一个巨大的字符串.
command.CommmandText = "DELETE FROM Students WHERE name = @name";
command.Parameters.Add(new MySqlParameter("@name", String.Format("'{0}'", String.Join("' or name = '", names)));
command.NonQuery();
Run Code Online (Sandbox Code Playgroud)
上述方法不起作用.它没有抛出任何错误/异常,它只是根本不按我想要的方式工作.
我应该怎么做呢?
我想过循环遍历List<string>并只执行每一个名字.
foreach(string name in names)
{
command.CommmandText = "DELETE FROM Students WHERE name = @name";
command.Parameters.Add(new MySqlParameter("@name", name));
command.NonQuery();
command.Parameters.Clear();
}
Run Code Online (Sandbox Code Playgroud)
但这需要很长时间,因为实际List<string>情况非常大.我想尝试尽可能少地执行.
谢谢!
我想创建一个子查询,它产生一个数列列表作为单列结果,像MindLoggedOut这样做但没有@xxml变量,因此它可以WHERE作为纯字符串(子查询)附加到表达式而不带sql参数.问题是参数(或变量)的替换使查询运行速度慢5000倍,我不明白为什么.是什么导致这种巨大差异?
例:
/* Create a minimalistic xml like <b><a>78</a><a>91</a>...</b> */
DECLARE @p_str VARCHAR(MAX) =
'78 91 01 12 34 56 78 91 01 12 34 56 78 91 01 12 34 56';
DECLARE @p_xml XML = CONVERT(XML,
'<b><a>'+REPLACE(@p_str,' ','</a><a>')+'</a></b>'
);
SELECT a.value('(child::text())[1]','INT')
FROM (VALUES (@p_xml)) AS t(x)
CROSS APPLY x.nodes('//a') AS x(a);
Run Code Online (Sandbox Code Playgroud)
这将返回一个数每行和是相当快的(不是字符串分离器更快20X办法我用到目前为止,类似 于 这些.我测量的SQL服务器CPU时间上20倍的加速,与@p_str含有3000号).
现在,如果我@p_xml将查询的内容内联到:
SELECT a.value('(child::text())[1]','INT')
FROM (VALUES (CONVERT(XML,
'<b><a>'+REPLACE(@p_str,' ','</a><a>')+'</a></b>'
))) AS t(x) …Run Code Online (Sandbox Code Playgroud) sql-server ×5
c# ×4
sql ×4
mysql ×3
parameters ×2
ado.net ×1
having ×1
performance ×1
scala ×1
slick ×1
t-sql ×1
transactions ×1
xml ×1