使用ExecuteNonQuery运行存储过程不是';t创建我的表,但该表是在SSMS中执行sp时创建的

本文关键字:创建 SSMS sp 执行 我的 存储过程 运行 ExecuteNonQuery 使用 | 更新日期: 2023-09-27 17:59:17

一些注意事项:

  1. ExecuteNonQuery返回-1
  2. ExecuteNonQuery将删除该表(@droptable),但不会创建新表(@code
  3. @code查询的长度为10265个字符
  4. 存储过程在SSMS中运行良好,并返回表中的22行

关于为什么C#的ExecuteNonQuery函数似乎没有执行存储过程的"exec(@code)"部分,有什么想法吗?

ALTER procedure [dbo].[sp_create_EditControlResultsPivot] 
as
begin
    declare @t nvarchar (250); 
    set @t = 'editControlResults'
    declare @newtable nvarchar(250); 
    set @newtable = 'dbo.' + @t + 'Pivot'
    declare @nonPivotColumn1 nvarchar(250); 
    set @nonPivotColumn1 = 'num'
    declare @nonPivotColumn2 nvarchar(25); 
    set @nonPivotColumn2 = 'File_Name'
    declare @droptable nvarchar(max); 
    set @droptable =  
'if EXISTS (select * from sys.objects where object_id = object_id(N''' + @newtable + '''))
begin drop table ' + @newtable + ' end
'
    declare @i int 
    set @i = 1;
    declare @itemList nvarchar(max);
    declare @code nvarchar(max);
    while @i <= (
        select COUNT(*) 
        from sys.columns c 
        left join sys.tables t on c.object_id = t.object_id 
        where 1=1 
          and c.name not like @nonPivotColumn1 
          and c.name not like @nonPivotColumn2
          and t.name = @t
    ) 
    begin
    set @itemList = @itemList + ', ' +
    (
        select col from 
        (
            select c.name as col, ROW_NUMBER () over (order by c.name) as num from
            sys.columns c left join sys.tables t on c.object_id = t.object_id 
            where 1=1
            and c.name not like @nonPivotColumn1
            and c.name not like @nonPivotColumn2
            and t.name = @t 
        ) sub where num = @i
    )
    set @i = @i + 1
  end
  set @itemList = (select substring(@itemList, 2, LEN(@itemList)))
  set @code = '
  SELECT ' + @nonpivotcolumn2 + ', Item
  into ' + @newtable + '
FROM
(SELECT ' + @nonpivotcolumn2 + ', ' + @itemList + '
FROM ' + @t + ') sub
UNPIVOT
(Value FOR Item IN (' + @itemList + ')
) AS sub
where Value = ''true''
'
exec(@droptable)
exec(@code);
--print(len(@code))
END
--exec sp_create_EditControlResultsPivot

使用ExecuteNonQuery运行存储过程不是';t创建我的表,但该表是在SSMS中执行sp时创建的

ExecuteNonQuery方法返回受影响的行数。请改用ExecuteReader方法。

SqlCommand.ExecuteReader方法

从ExecuteNonQuery返回数据的唯一方法是通过Output参数。

我怀疑你的评论#3。@code查询的长度为10265个字符。。。可能是个问题。。。我认为C#的调用将其削减到只有4000或8000个字符。。。

由于您不需要结果集,所以ExecuteNonQuery很好。

尝试的东西:

  1. 尝试在表中插入@code变量的内容(在过程中),看看是否得到了正确的sql。。。当从SSMS和C#调用执行时

  2. 如果您在步骤1中得到一个有效的sql查询(我对此表示怀疑)。。。尝试在SSMS中执行该查询,看看它是否真的有效。。。