Некоторые примечания:
ExecuteNonQuery
возвращает -1ExecuteNonQuery
удалит таблицу (@droptable
), но не создаст новую таблицу (@code
)- длина запроса
@code
составляет 10265 символов. - Хранимая процедура отлично работает в 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
sp_
для своих хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования ( см. Именование хранимых процедур), и вы рискуете столкнуться с конфликтом имен в будущем. Это также плохо сказывается на производительности ваших хранимых процедур. Лучше просто избегатьsp_
и использовать в качестве префикса что-то другое - или вообще не использовать префикс! - person marc_s   schedule 23.06.2015CREATE PROCEDURE
в ее начале. Вам не понадобится префикс, чтобы сказать вам это. - person John Saunders   schedule 23.06.2015@droptable
выполняется? Означает ли это, что вы видели там таблицу после запуска в SSMS, затем вы запускаете через C#, а затем выполнениеSELECT
для этой таблицы в SSMS дает ошибку, что таблицы больше не существует? Если вы хотите увидеть, был ли усечен запрос@code
, почему бы вам не добавить следующее прямо над строкойEXEC(@code)
:SELECT @code AS [query] INTO tempdb.dbo.CodeQuery;
. Затем запустите через С#. Затем запуститеSELECT * FROM tempdb.dbo.CodeQuery;
в SSMS. - person Solomon Rutzky   schedule 23.06.2015