Sql 传递字符串时从表中删除行
大家好,我想创建一个过程,接收一个Sql 传递字符串时从表中删除行,sql,tsql,Sql,Tsql,大家好,我想创建一个过程,接收一个int和一个string,其ID如下: IntCompeteID=1 StringTeamIDs=“1,8,9” 这意味着有3个TeamID,TeamID=1、TeamID=8和TeamID=9 这是我的DBModel: 所以我想做的是在TeamCompetie中插入SportID和CompetieID,如果没有相等的SportID和CompetieID 像这样: TeamCompeteID TeamID CompeteID 1
int
和一个string
,其ID如下:
Int
CompeteID=1
String
TeamIDs=“1,8,9”
这意味着有3个TeamID,TeamID=1、TeamID=8和TeamID=9
这是我的DBModel:
所以我想做的是在TeamCompetie中插入SportID和CompetieID,如果没有相等的SportID和CompetieID
像这样:
TeamCompeteID TeamID CompeteID
1 1 1
4 8 1
5 9 1
6 8 1 <---- Can't do this
TeamCompetiteID TeamID CompetiteID
1 1 1
4 8 1
5 9 1
6 8 1首先,以这种方式传递数据是一个非常糟糕的主意。您应该真正尝试将数据标准化,并在每个字段中有一个值
但是,如果您无法避免这种情况,我建议您使用字符串拆分函数,例如,如果您使用的是2016年之前的SQL Server版本(),它将返回一个可以从给定字符串和分隔符连接到的表
使用上面Jeff的函数:
select *
from dbo.DelimitedSplit8K('1,8,9',',')
结果:
+------------+------+
| ItemNumber | Item |
+------------+------+
| 1 | 1 |
| 2 | 8 |
| 3 | 9 |
+------------+------+
+-----------+------+
| CompeteID | Item |
+-----------+------+
| 1 | 1 |
| 1 | 8 |
| 1 | 9 |
+-----------+------+
因此,要与您的桌子一起使用:
declare @t table(CompeteID int,TeamID nvarchar(10));
insert into @t values(1,'1,8,9');
select t.CompeteID
,s.Item
from @t t
cross apply dbo.DelimitedSplit8K(t.TeamID,',') s
结果:
+------------+------+
| ItemNumber | Item |
+------------+------+
| 1 | 1 |
| 2 | 8 |
| 3 | 9 |
+------------+------+
+-----------+------+
| CompeteID | Item |
+-----------+------+
| 1 | 1 |
| 1 | 8 |
| 1 | 9 |
+-----------+------+
然后,您可以在更新
/插入
/删除
逻辑的其余部分中使用此表。对不起,您能为我需要执行的过程建立一个模型吗?因为我不太懂t-sql逻辑,我很抱歉。@Pedro如果你想询问我的咨询费率,那就一定要问。如果你认为这个网站是一个免费的代码编写服务,那么就不是了。你在我的答案中已经有了所有你需要的东西,可以开始用谷歌搜索并自己计算出答案。不够清晰。例如,添加15行,我们可以在一个表中看到所有变体。我不确定第一部分和第二部分(可能是第_number()行(按TeamId划分,按TeamCompeteId描述划分CompeteId顺序)以及我没有得到的第三部分。