SQL Server中是否可以定义String常量?我正在重写一些查询以使用存储过程,并且每个查询都具有相同的长字符串作为IN语句[a],[b],[c]等的一部分。
预计不会发生变化,但未来可能会发生变化。它也是一个非常长的字符串(几百个字符),所以如果有一种方法可以更容易地为它定义一个全局常量。
如果可以的话,我也有兴趣知道它是否适用于这种情况。我曾尝试将此String作为参数传递,因此我可以从应用程序中的单个点控制它,但存储过程不喜欢它。
答案 0 :(得分:4)
您可以创建一个包含单个列和行的表,并禁止对其进行写入。
将其用作全局字符串常量(或其他常量,如果您愿意)。
答案 1 :(得分:1)
您要求一件事(MS SQL中的字符串常量),但似乎可能需要其他东西。我说这个的原因是因为你给出了一些关于你的最终目标的暗示,这似乎是在多个存储过程中使用相同的IN子句。
最大的线索在最后一句话中:
我曾尝试将此字符串作为传递 参数,所以我可以控制它 我的申请中的一个点 但存储过程并不喜欢 它
如果没有SQL脚本的详细信息,我将尝试使用一些psychic debugging技术,看看我是否能够达到我认为的实际目标,而不一定是您的既定目标。
当你试图传入一个字符串作为参数时,鉴于你的存储过程“不喜欢”,我猜测字符串的组成只是一个分隔的值列表,类似“10293,105968,501940” “或”Juice,Milk,Donuts“(不注意实际的列表值 - 重要的部分是分隔列表本身)。你的SQL可能看起来像这样(再次,忽略特定的名称,并专注于一般概念):
SELECT Column1, Column2, Column3
FROM UnknownTable
WHERE Column1 IN (@parameterString);
如果这大致描述了您尝试采用的路径,那么您需要重新考虑您的方法。使用常规的T-SQL语句,您将无法将一串参数值传递给IN子句 - 它只是不知道如何处理它们。
但是有其他选择:
Dynamic SQL - 你可以建立起来 整个SQL语句,参数和 all,然后在SQL中执行 数据库。这可能不是什么 你正试图实现,因为你 将脚本移动到存储 程序。但它列在这里 为了完整。
价值表 - 您可以创建单列表 具有特定值的你 有兴趣。然后你的存储 过程可以简单地使用该列 来自此表的IN子句)。 这样,就没有动态SQL 需要。既然你说明了 价值不太可能改变, 你可能只需要填充 表一次,并在任何地方使用它 适当。
String Parsing来 派生价值清单 - 你可以 将值列表作为字符串传递, 然后实现代码来解析 列表上的表结构 飞。另一种形式 技术是传递XML 包含值的结构,和 使用MS SQL Server的XML 派生表格的功能。
定义一个表值函数 返回要使用的值 - 我有 没试过这个,所以我可能会 错过了什么,但你应该 能够在a中定义值 表值函数(可能使用 一堆UNION语句或 某事),并调用该功能 在IN子句中。再次 - 这是一个 未经检验的建议,需要 要完成确定 这是可行的。
我希望有所帮助(假设我已经猜到了你的潜在窘境)。
为了将来参考,如果您可以包含SQL脚本显示,那将非常有用 您的表结构和存储过程逻辑,以便我们可以看到您实际尝试的内容。这将大大提高您收到的答案的有效性。感谢。
P.S。 String Parsing的链接实际上包含了大量用于将信息数组(即列表)传递给存储过程的技术 - 对于这类事物来说,它是一个非常好的资源。
答案 2 :(得分:0)
除了Oded建议的字符串常量表之外,我还使用了标量函数来封装一些常量。当然,这对于更少的常数会更好,但它们的使用很简单。
也许是一个组合 - 字符串常量表,其中一个函数接受一个键并返回该字符串。您甚至可以通过使用该函数获取“区域”并将其与键组合以返回不同的字符串来将其用于本地化!