SQL变量;声明何时不存在参数

时间:2010-11-03 09:44:00

标签: sql-server ado.net ssms

我正在编写一个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

有没有办法检查是否已经采用了变量名?

2 个答案:

答案 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#程序运行的是没有变量但带参数的版本。