将SQL Server查询转换为C#动态查询失败

将SQL Server查询转换为C#动态查询失败,c#,sql,sql-server,C#,Sql,Sql Server,我有一个SQL Server查询,它作为存储过程运行得非常好: CREATE PROCEDURE "InputData_GetStatus" @id VARCHAR(250) AS BEGIN SET NOCOUNT ON; DECLARE @lookingFor NVARCHAR(36); SELECT @lookingFor = CONVERT(NVARCHAR(36), (SELECT TOP 1(UID)

我有一个SQL Server查询,它作为存储过程运行得非常好:

CREATE PROCEDURE "InputData_GetStatus" 
     @id VARCHAR(250) 
AS 
BEGIN 
    SET NOCOUNT ON;

    DECLARE @lookingFor NVARCHAR(36);

    SELECT @lookingFor = CONVERT(NVARCHAR(36),  (SELECT TOP 1(UID) 
                                                 FROM StudyInput 
                                                 WHERE ID = @id));
    IF (@lookingFor IS NULL)
        RETURN;

    DECLARE @query NVARCHAR(2000);
    SET @query = 'select null as InUID, OutUID, InNext, Status, ''StudyInput'' as TableName from StudyInput_InOut where OutUID = ''' + @lookingFor + '''';

    DECLARE @stepName VARCHAR(150);
    DECLARE @processUID uniqueidentifier;

    DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR
        SELECT stepName, ProcessUID 
        FROM StudyInput_DirectLink 
        WHERE InputUID = @lookingFor 


    OPEN MY_CURSOR 

    FETCH NEXT FROM MY_CURSOR INTO @stepName, @processUID 

    WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET @query = @query + ' union all ';
        SET @query = @query + 'select InUID, OutUID, InNext, Status, ''' + @stepName + ''' as TableName from ' + @stepName + '_InOut where OutUID = ''' + convert(nvarchar(36), @processUID) + '''';

        FETCH NEXT FROM MY_CURSOR INTO @stepName, @processUID;
    END 

    CLOSE MY_CURSOR;
    DEALLOCATE MY_CURSOR;

    EXECUTE sp_executesql @query;
END
在C#中,我编写了使用动态表和存储过程动态创建数据库的代码

我正在尝试将上面的查询转换为一个字符串,每次创建数据库时,我都可以执行该字符串将其创建为存储过程

但是看起来我的格式是错误的,因为我一直得到以下错误(或其变体)

“”附近的语法不正确。
“++@stepName+”附近的语法不正确

这就是我现在在C中查询的内容#

助手功能:

static public void CreateStoredProcedure(
  string db,
  string queryName,
  string parameters,
  string procedure)
{
  ExecuteQuery(
    db,
    String.Format("if exists(Select * from sysobjects where name = '{0}')  begin drop procedure {0} end; EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [{0}] {1} AS BEGIN SET NOCOUNT ON; {2}; END'",
      queryName,
      parameters,
      procedure));
}

static public void ExecuteQuery(
  string db,
  string query)
{
  SqlConnection connection = null;
  try
  {
    connection = new SqlConnection(string.Format(connectionString, db));
    connection.Open();

    // Creates DB
    using (SqlCommand command = new SqlCommand(query, connection))
    {
      command.ExecuteNonQuery();
    }
  }
  catch (Exception ex)
  {
    throw ex;
  }
  finally
  {
    connection.Close();
  }
}
我敢肯定,问题归结为构建查询字符串时所需的“数量”

但我只是不知道需要多少才能正确格式化

编辑:

这是执行前的完整查询:

if exists(Select * from sysobjects where name = 'InputData_GetStatus')
begin drop procedure InputData_GetStatus end;
EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [InputData_GetStatus] @id varchar(250) AS BEGIN SET NOCOUNT ON; declare @lookingFor nvarchar(36); select @lookingFor = convert(nvarchar(36), (select top 1(UID) from StudyInput where MINC = @id)); if (@lookingFor is null) return; DECLARE @query NVARCHAR(MAX); set @query = 'select null as InUID, OutUID, InNext, Status, ''StudyInput'' as TableName from StudyInput_InOut where OutUID = ''' + @lookingFor + ''''; SELECT @query = COALESCE(@query + ' union all select InUID, OutUID, InNext, Status, ''' + stepName + ''' as TableName from ' + stepName + '_InOut where OutUID = ''' + convert(nvarchar(36), ProcessUID) + '''', '') FROM StudyInput_DirectLink where InputUID = @lookingFor EXECUTE sp_executesql @query;; END'

最后,在运行在执行之前生成的字符串查询的子集之后,它开始工作,然后每次添加更多的字符串查询,并将输出与原始查询进行比较

如果有人遇到同样的问题,需要在自己的查询中解决,我会在这里发布最终结果

  string query = "";

  query += "declare @lookingFor nvarchar(36);";

  // Search for the UID of the InputKey associated to the Data Input we want to query the status for
  query += string.Format(" select @lookingFor = convert(nvarchar(36), (select top 1(UID) from StudyInput where {0} = @id));", this._config.InputKey);
  query += " if (@lookingFor is null) return;";

  query += " DECLARE @query NVARCHAR(MAX);";

  // Build a dynamic query to get the status of the data for each step it has been involved with
  // Starting with StudyInput
  query += " set @query = ''select null as InUID, OutUID, InNext, Status, ''''StudyInput'''' as TableName from StudyInput_InOut where OutUID = '''''' + @lookingFor + '''''''';";

  // Get all the direct links involving the Data
  // And build a dynamic query for each Step table
  query += " SELECT @query = COALESCE(@query + '' union all select InUID, OutUID, InNext, Status, '''''' + stepName + '''''' as TableName from '' + stepName + ''_InOut where OutUID = '''''' + convert(nvarchar(36), ProcessUID) + '''''''', '''')";
  query += " FROM StudyInput_DirectLink";
  query += " where InputUID = @lookingFor;";

  // Execute the dynamic query
  query += " EXECUTE sp_executesql @query;";

旁注:
throw-ex应该是
抛出。这将在异常中保留堆栈跟踪,否则它将重置为
catch
@igor内,我将ex放在那里,因为我在那里有一个调试断点。最终版本将不会有捕获,因为在更高级别上有一个捕获。提示:在执行查询之前,附加调试器并在末尾放置断点。将查询复制为文本,并将其放在SSMS中,然后查看是否会出现相同的错误(很可能会)。这会让您更好地了解错误发生的原因。我不确定是否需要使用光标。。。SELECT本身可以建立字符串。还有STUFF/FOR-XML技巧,用于构建字符串,而不必担心任何尾随的逗号或cruft。应该尽可能避免使用光标,在这里似乎完全可以避免使用光标。在我看来,你需要进一步加倍使用撇号。您正在动态SQL中创建动态SQL,因此所有撇号将再次加倍。
  string query = "";

  query += "declare @lookingFor nvarchar(36);";

  // Search for the UID of the InputKey associated to the Data Input we want to query the status for
  query += string.Format(" select @lookingFor = convert(nvarchar(36), (select top 1(UID) from StudyInput where {0} = @id));", this._config.InputKey);
  query += " if (@lookingFor is null) return;";

  query += " DECLARE @query NVARCHAR(MAX);";

  // Build a dynamic query to get the status of the data for each step it has been involved with
  // Starting with StudyInput
  query += " set @query = ''select null as InUID, OutUID, InNext, Status, ''''StudyInput'''' as TableName from StudyInput_InOut where OutUID = '''''' + @lookingFor + '''''''';";

  // Get all the direct links involving the Data
  // And build a dynamic query for each Step table
  query += " SELECT @query = COALESCE(@query + '' union all select InUID, OutUID, InNext, Status, '''''' + stepName + '''''' as TableName from '' + stepName + ''_InOut where OutUID = '''''' + convert(nvarchar(36), ProcessUID) + '''''''', '''')";
  query += " FROM StudyInput_DirectLink";
  query += " where InputUID = @lookingFor;";

  // Execute the dynamic query
  query += " EXECUTE sp_executesql @query;";