通过在SQL Server 2012中将名称作为早期定义和值赋值变量传递来创建表

时间:2016-01-27 15:04:59

标签: sql-server stored-procedures

我正在尝试为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'附近的语法不正确。

上述程序有什么问题,还是有其他方法可以实现上述任务?

3 个答案:

答案 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}}