我正在编写一个sql脚本,我想使用Management Studio开发查询,并使用C#程序在生产中运行它。
我的查询包含参数,如此;
SELECT * FROM TABLE
WHERE id = @id
我可以在C#程序中输入@id
的值,这很有效。但是,我还想在Management Studio中声明测试的默认值。所以我真的想写这样的伪代码;
if not declared @id
declare @id int
set @id=43
end if
SELECT * FROM TABLE
WHERE id = @id
有没有办法检查是否已经采用了变量名?
答案 0 :(得分:4)
你无法完全按照自己的意愿去做。我建议:
1)将脚本作为一个sproc包装起来并给出params的默认值 2)在脚本顶部包含一个注释块,然后您可以在SSMS中运行时取消注释:
/*
-- Default variables for testing
DECLARE @Id INTEGER
SET @Id = 43
*/
SELECT * FROM Table WHERE id = @Id
答案 1 :(得分:1)
我已经设法通过在脚本中标记默认变量来取得一些进展,如此;
/** DEFAULTS **/
declare @id int
set @id = 43
/** END DEFAULTS **/
然后在我的C#程序中预处理脚本,就像这样;
script = RemoveBlock(script, "DEFAULTS");
并实现这样的功能;
public static string RemoveBlock(string script, string blockName)
{
if (script == null) { return null; }
var startTag = string.Format("/** {0} **/", blockName);
var endTag = string.Format("/** END {0} **/", blockName);
var startTagIdx = script.IndexOf(startTag);
if (startTagIdx == -1) { return script; }
var endTagIdx = script.IndexOf(endTag, startTagIdx + startTag.Length);
if (endTagIdx == -1) { return script; }
var endOfEndTag = endTagIdx + endTag.Length;
var beforeBlock = script.Substring(0, startTagIdx);
var afterBlock = script.Substring(endOfEndTag);
return beforeBlock + afterBlock;
}
所以C#程序运行的是没有变量但带参数的版本。