如何将数组传递给SQL Server存储过程?
例如,我有一份员工清单.我想将此列表用作表,并将其与另一个表连接.但是员工列表应该作为参数从C#传递.
例如.我可以写这样的代码:
public void InactiveCustomers(IEnumerable<Guid> customerIDs)
{
//...
myAdoCommand.CommandText =
"UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)";
myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs;
//...
}
Run Code Online (Sandbox Code Playgroud)
我知道的唯一方法是加入我的IEnumerable,然后使用字符串连接来构建我的SQL字符串.
我的存储过程中有一个nvarchar(MAX),它包含int值列表,我这样做是因为无法将int列表传递给我的存储过程,但是,现在我遇到问题,因为我的数据类型是int我想比较字符串列表.有没有办法可以做同样的事情?
---myquerry----where status in (@statuslist)
Run Code Online (Sandbox Code Playgroud)
但是statuslist现在包含字符串值而不是int,那么如何将它们转换为INT?
更新:
USE [Database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP]
(
@FromDate datetime = 0,
@ToDate datetime = 0,
@ID int=0,
@List nvarchar(MAX) //This is the List which has string ids//
)
Run Code Online (Sandbox Code Playgroud)
AS SET FMTONLY OFF; DECLARE @sql nvarchar(MAX),@ paramlist nvarchar(MAX)
SET @sql = 'SELECT ------ and Code in(@xList)
and -------------'
SELECT @paramlist = '@xFromDate datetime,@xToDate datetime,@xId int,@xList nvarchar(MAX)'
EXEC sp_executesql @sql, @paramlist,
@xFromDate = @FromDate ,@xToDate=@ToDate,@xId=@ID,@xList=@List …
Run Code Online (Sandbox Code Playgroud) 我有这个数组
$REV = Array
(
0 => 240,
1 => 241,
2 => 242,
3 => 243,
4 => 249
);
Run Code Online (Sandbox Code Playgroud)
我现在使用此代码插入,将每个数组的元素存储在$ id,$ userID,Type和Date的行中
if (!empty($REV)) {
foreach ($REV as $val_rev) {
$values_rev[] = "('" . $ID . "','REV','" . $val_rev . "','" . $IDUSER . "',GETDATE())";
}
$values_rev_insert = implode(',', $values_rev);
$query_rev = "insert into dbo.CCLine (ID,CCType,CSID,IdUSer,DateCreated)values" . $values_rev_insert;
mssql_query($query_rev);
}
Run Code Online (Sandbox Code Playgroud)
但我想要的是可以使用这个存储过程,但我不知道如何使用sp一次插入:
$stmt = mssql_init('sp_insertRev');
mssql_bind($stmt, '@ID', $ID, SQLINT4);
mssql_bind($stmt, '@CCType', 'REV', SQLVARCHAR);
Run Code Online (Sandbox Code Playgroud)
该阵列在这里不起作用
mssql_bind($stmt, '@CSID', $val_rev, SQLINT4);//An example …
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring JDBCTemplate连接到SQL Server.
我有一个需要插入SQL Server表的对象列表.
我做的是以下内容:
public void batchInsert(final List<Bean> list) {
final String sql = "insert into temp"
+ "(id, name, amount, location, time, price) "
+ " values (?, ?, ?, ?, ?, ?)";
getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Bean vo = list.get(i);
ps.setString(1, vo.getId());
ps.setString(2, vo.getName());
ps.setDouble(3, vo.getAmount());
ps.setString(4, vo.getLocation());
ps.setString(5, vo.getTime());
ps.setDouble(6, vo.getPrice());
}
@Override
public int getBatchSize() {
return list.size();
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是现在,我想将参数List<Bean> list …
我有一个字符串列表,我需要检查列表中的任何值是否包含在数据库table.if exists中返回现有值的数据集.
public DataSet CheckDocumentNumber(List<string> DocNumber)
{
DataSet DocNum = new DataSet();
SqlTransaction transaction = DALDBConnection.SqlConnection.BeginTransaction();
try
{
string[] taleNames = new string[1];
taleNames[0] = "DocNum";
SqlParameter[] param = new SqlParameter[1];
param[0] = new SqlParameter("@DocNumber", DocNumber);
SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, "spCheckDocNumber", DocNum, taleNames, param);
transaction.Commit();
}
catch (Exception e)
{
transaction.Rollback();
}
return DocNum;
}
Run Code Online (Sandbox Code Playgroud)
我的存储过程是
CREATE PROCEDURE spCheckDocNumber
@DocNumber VARCHAR(MAX)
AS
BEGIN
SELECT * FROM tblDocumentHeader WHERE DocumentNumber = @DocNumber
END
Run Code Online (Sandbox Code Playgroud)
我需要知道如何将列表传递给存储过程以及如何在过程中检查列表.请帮助
我有一个带有呼叫数据记录的表,每个呼叫有一个呼叫数据,其中一个字段是我们在查询数据库时使用的CallerId.
我们使用以下TSQL来模拟一个数组参数,这是要走的路还是我们要离开?
ALTER PROCEDURE [dbo].[spStudio_Get_Smdr]
@beginTime INT,
@endTime INT,
@subscribers VARCHAR(MAX) = NULL,
@exchanges VARCHAR(MAX) = '1:',
@beginDateValue int,
@endDateValue int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @exch TABLE(Item Varchar(50))
INSERT INTO @exch
SELECT Item FROM [SplitDelimitedVarChar] (@exchanges, '|') ORDER BY Item
DECLARE @subs TABLE(Item Varchar(19))
INSERT INTO @subs
SELECT Item FROM [SplitDelimitedVarChar] (@subscribers, '|') ORDER BY Item
SELECT
,[Level]
,[Timestamp]
,[EndYear]
,[EndDate]
,[EndTime]
,[CallingNumber]
,[DialledNumber]
..more fields between
,[DateValue]
,[TimeValue]
FROM [SmdrFormat] AS S
WHERE
(S.[DateValue] BETWEEN @beginDateValue AND …
Run Code Online (Sandbox Code Playgroud) 我有一张桌子DEPT
,里面有两列 - ID, NAME
.
将使用DEPT
表中的ID显示搜索表单,用户可以选择任意数量的ID并提交表单,以获取相关信息NAMEs
.
澄清/输入:
还有其他解决办法吗?
注意:
此示例很简单,有1个表 - 在现实生活中,我必须处理超过6个表!
谢谢你的任何建议