我的代码确实有效,我不需要帮助。我想知道我所做的是否被认为是可以接受的。
在我正在编写的 T-SQL 脚本的一个特定部分中,我必须运行几乎类似的插入语句大约 20 次。在每种情况下,只有一部分 WHERE 子句不同。想要循环,而不是有 20 个几乎相同的插入,我使用 WHILE 循环来运行一些动态 SQL,并将 WHERE 子句的不同部分存储在数据库中。奇迹般有效。值得注意的是,这种情况下的 INSERT 语句在数量或内容上可能会有所不同,我觉得这个解决方案可以很简单地处理这个问题。
当我向我的一位同事展示这个问题的解决方案时,他的一只眉毛扬了起来,他看着我,好像我长出了一个新脑袋。他建议有更好的方法。可能是这样,而且我是大三学生,我会谦虚地接受它。但是,我确实想问社区这是否看起来很奇怪、不专业或违反一般标准/最佳实践。
如果需要,我可以发布代码,但出于此目的,希望我已经给了你足够的评论一种或另一种方式。
TIA
编辑 -
好的,这里要求的是代码。我不会试图解释它,因为它是一罐蠕虫,但它就是这样。
DECLARE @varOfferId INT = 1
DECLARE @MaxOfferId INT = (SELECT COUNT(DISTINCT offer_id) FROM obp.CellCodes_Offers
DECLARE @SQLWhereClause VARCHAR(1000)
DECLARE @SQLStatement VARCHAR(1000)
WHILE @varOfferId <= @MaxOfferId
BEGIN
SET @SQLWhereClause = (SELECT where_clause FROM obp.Offers WHERE offer_id = @varOfferId)
SET @SQLStatement =
'INSERT INTO obp.Offers_Contacts ' +
'SELECT DISTINCT o.contact_id, ' + CONVERT(VARCHAR(2), @varOfferId) +
' FROM obp.Onboarding AS o
WHERE ' + @SQLWhereClause +
' AND o2.contact_id = o.contact_id)
AND ' + CONVERT(VARCHAR(2), @varOfferId) + ' IN(
SELECT cc.offer_id
FROM obp.CellCodes_Offers AS cc
WHERE cc.cellcode = o.cellcode)'
EXECUTE (@SQLStatement)
SET @varOfferId = @varOfferId + 1
END
因此,到目前为止,似乎一致认为这不是一个好主意。好的,我很好。但我不确定我是否同意从维护的角度来看它更容易。现在我的代码查看“优惠”表,获取行数并循环多次。如果他们在未来添加更多报价(或减少报价),我所要做的就是插入(或删除)并在报价中包含适当的 WHERE 子句,我们就在路上。或者,如果我编写所有单独的 INSERTS,如果它们添加或删除,我必须触摸代码,这意味着测试/qa。想法?
但是,我确实同意其他几点,所以我想我明天会回到绘图板上!