Динамический SQL приводит во временную таблицу к Хранимой процедуре SQL

Фрагмент ниже работает на JSFiddle . Не забудьте включить всплывающие окна для chrome, если вы хотите, чтобы ваши всплывающие окна не блокировались chrome , взгляните на этот вопрос.

function PrintImage() {
    id = 'chart';
    var canvas = document.getElementById(id);
    var win = window.open(canvas.toDataURL(), '_blank');
    
    win.document.write("
"); win.print(); win.location.reload(); } function drawImage(){ var ctx = $("canvas")[0].getContext("2d"), img = new Image(); img.onload = function(){ ctx.drawImage(img, 0, 0, 500, 500); $("span").text("Loaded."); }; img.src = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7udaoWuG0i57WCc7OyxkWG0jCkqMIBa7D7ff2Dk1Fk7rCsoQr"; img.crossOrigin ="anonymous"; $("span").text("Loading..."); } $("#add").click(drawImage); $("#print").click(PrintImage);



    
        Canvas Replace       
    

    
        
        
        
    
    
    

44
задан slugster 25 July 2011 в 08:39
поделиться

3 ответа

Попытка:

SELECT into #T1 execute ('execute ' + @SQLString )

И это пахнет очень плохо как уязвимость внедрения SQL.

<час>

исправление (на комментарий @CarpeDiem):

INSERT into #T1 execute ('execute ' + @SQLString )

также, опустите 'execute', если строка sql - что-то другое, чем процедура

37
ответ дан Brad 26 November 2019 в 21:56
поделиться

Не уверенный, если я понимаю хорошо, но возможно Вы могли бы сформировать оператор CREATE в строке, затем выполнить ту Строку? Тем путем Вы могли добавить столько столбцов, сколько Вы хотите.

-1
ответ дан Seb 26 November 2019 в 21:56
поделиться

Таблицу можно определять динамически точно так же, как вы динамически вставляете в нее, но проблема заключается в области временных таблиц. Например, этот код:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE #T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO #T1 (Col1) VALUES ('This will not work.')
SELECT * FROM #T1

вернет ошибку «Недопустимое имя объекта '# T1'». Это связано с тем, что временная таблица № T1 создается на «более низком уровне», чем блок выполнения кода. Чтобы исправить это, используйте глобальную временную таблицу:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (Col1 varchar(20))'
EXEC(@sql)
INSERT INTO ##T1 (Col1) VALUES ('This will work.')
SELECT * FROM ##T1

Надеюсь, это поможет, Джесси

31
ответ дан 26 November 2019 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: