0

Мне нужно вставить объемные данные в базу данных, а таблица также создается динамически.Для динамического StoredProcedure с пользовательской ошибкой определенного типа данных: Должен объявить скалярную переменную «@ myTableType2»

Сначала создали UserDefined Datatypes

-- This is my user defined type 
CREATE TYPE [dbo].[Custom_block] AS TABLE(
    [Name] [nvarchar](200) NULL, 
    [population] [nvarchar](200) NULL 
) 

Тогда у меня есть DataTable (C#), который я должен вставить в таблицу SQL.

--My StoredProcedure : 
    CREATE PROCEDURE dumpData(
    @myTableType [Custom_block] readonly, 
    @tableName NVARCHAR(200) 
    ) 

AS 
BEGIN 
DECLARE @sql NVARCHAR(MAX); 
Declare @myTableType2 as [Custom_block]; 
set @[email protected]; 

SET @sql=N' truncate table '+QUOTENAME(@tableName)+ ' 
    insert into '+QUOTENAME(@tableName)+' select * from '[email protected] 

    EXECUTE sp_executesql @sql 
END 

Ошибка подводит:

Msg 137, Level 16, State 1, Procedure dumpData, Line 12 Must declare the scalar variable "@myTableType2"

+0

remove 'set @ myTableType2 = @ myTableType;' use 'insert в select query to copy'..i'm not sure. –

+0

уже пробовал без set '@ myTableType2 = @ myTableType;' не работает –

+0

это не будет работать, потому что вы создаете команду, которая заканчивается на «select * from», и вы не конкатенируете с именем таблицы, а с самой таблицей. – GuidoG

ответ

1

Вам не требуется @ myTableType2, вы можете напрямую вставлять значения через параметр таблицы. Попробуйте вот так:

CREATE PROCEDURE dumpData (
    @myTableType [Custom_block] readonly 
    ,@tableName NVARCHAR(200) 
    ) 
AS 
BEGIN 
    DECLARE @sql NVARCHAR(MAX); 

    SELECT * 
    INTO #temp 
    FROM @myTableType 

    --DECLARE @myTableType2 [Custom_block]; 
    --SET @myTableType2 = @myTableType; 
    SET @sql = N' truncate table ' + QUOTENAME(@tableName) + ' 
    insert into ' + QUOTENAME(@tableName) + ' select * from #temp' 

    EXECUTE sp_executesql @sql 

    DROP TABLE #temp 
END 
+0

Получение этой ошибки ** Обязательно объявить скалярную переменную «@myTableType» ** –

+0

. То же самое, вы не можете сконфигурировать определенный пользователем тип в varchar @sql. – GuidoG

+0

Убедитесь, что вы создали пользовательский тип таблицы [Custom_block] в своем db. – StackUser

0

пытается добавить имя_таблицы как строка ..

как

CREATE PROCEDURE dumpData(
@myTableType varchar(50), 
@tableName NVARCHAR(200) 
) 
..... 
SET @sql=N' truncate table '+QUOTENAME(@tableName)+ ' 
insert into '+QUOTENAME(@tableName)+' select * from '[email protected] 

Я предполагаю, что это позволит решить проблему

+0

Точно то, что я пытался объяснить в своих комментариях, вы находитесь на месте – GuidoG

+0

эта проблема не работает, моя проблема заключается в использовании 'User Defined Type' .ie таблицы в моем случае, а не' VARCHAR() ' –

+0

да, но вы не можете сконфигурировать определяемый пользователем тип в @sql varchar – GuidoG