我正在尝试为create table创建存储过程,如下所示:
CREATE PROCEDURE tableCreation
AS
DECLARE @tableName NVARCHAR(30)
SET @tableName = 'Employee'
BEGIN
CREATE TABLE @tableName (
id INT NOT NULL
)
END
但是当我执行该程序时,我收到此错误:
Msg 102,Level 15,State 1,Procedure tableCreation,Line 7
'@tableName'附近的语法不正确。
上述程序有什么问题,还是有其他方法可以实现上述任务?
答案 0 :(得分:1)
您应该构建一个包含所需SQL的字符串,然后执行该字符串。这称为动态SQL。
create procedure tableCreation
as
declare @tableName nvarchar(30)
begin
declare @Sql NVARCHAR(MAX) = 'create table ' + @tableName + '
(
id int not null
)'
EXEC(@Sql)
end
您需要确保在传入@tableName变量之前验证该值以避免SQL注入攻击
http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html https://xkcd.com/327/
答案 1 :(得分:1)
对于初学者来说,这可能会有所帮助:
import {inject,bindable,noView,customElement} from 'aurelia-framework';
import 'jquery-ui';
import 'primeui'
import 'primeui/primeui-min.css!';
@customElement('p-rating')
@inject(Element)
@noView
export class Rating {
@bindable value;
@bindable disabled;
@bindable readonly;
@bindable stars;
@bindable cancel = true;
@bindable onrate;
@bindable oncancel;
constructor(element){
this.element=element;
}
attached(){
if(!this.stars){
this.stars=5;
}
$(this.element).puirating({
value: this.value,
stars: this.stars,
cancel: this.cancel,
disabled: this.disabled,
readonly: this.readonly,
rate: (event: Event, value: number) => {
if(this.onrate){
this.onrate({originalEvent: event, value: value});
} else {
console.log('No onrate callback');
}
},
oncancel: (event: Event) => {
if(this.oncancel){
this.oncancel({event});
} else {
console.log('No cancel callback');
}
}
});
}
detached(){
$(this.element).puirating('destroy');
}
}
但是有更好的(但仍然不是理想的)使用动态SQL的方法,例如参数化查询,这将减少代码易于SQL注入的变化。查看其中一个established articles on this topic。
但是,如果你没有将表名作为参数传递给程序,那么我想你可以安全地从SQL注入(虽然这是一种模糊和奇怪的行为)。
答案 2 :(得分:0)
{{1}}