Sql server 串联过程

Sql server 串联过程,sql-server,stored-procedures,concatenation,Sql Server,Stored Procedures,Concatenation,我正在尝试执行此选择: SELECT a.*,b.descricao as dscstatus,c.nome as cliente FROM pedidos a with(nolock), pedidos_status b with(nolock), cadastro c with(nolock) WHERE a.status <> '' and a.status=b.status and a.id_doc = c.id_doc

我正在尝试执行此选择:

 SELECT a.*,b.descricao as dscstatus,c.nome as cliente

 FROM pedidos  a with(nolock), 
    pedidos_status b with(nolock), 
     cadastro c with(nolock)  

 WHERE  a.status <> '' and 
  a.status=b.status and 
   a.id_doc = c.id_doc 
    and c.nome like 'CAR%'
     and data_inclusao BETWEEN '20160101' AND '20160202'
但它给了我一个错误信息:

Msg 203,16级,状态2,程序列表,第39行

名称“选择a.*,b.将a.描述为dscstatus,c.将c.nome作为来自pedidos a的客户,具有(nolock),pedidos_状态b具有(nolock),cadastro c具有(nolock),其中a.status''和a.status=b.status和a.id_doc=c.id_doc以及类似于c.nome的“CAR%”和数据_inclusao介于“20160101”和“20160202”之间不是有效标识符


这是因为我在过程结束时使用了EXECUTE@SQL吗?顺便说一句,我是新来的。

动态SQL是
EXECUTE(@SQL)
它执行@SQL中的字符串。您正在执行的是变量过程执行:
EXECUTE@SQL
,它尝试执行一个名为@SQL variableoh的存储过程。。。非常感谢。。。它工作得非常好……如果使用以下参数调用它,您会有多糟糕:
@TipoBusco='PEDIDO',@chaveBusca='';吊床--?查看
sp\u executesql
。我不知道你的意思。你为什么要在这里使用动态sql?这里的内容容易受到sql注入的攻击。您应该在这里使用参数化查询,而忽略动态sql。您还拥有旧的ANSI-89样式的联接语法。你应该更新一下。在继续使用nolock提示乱丢数据库之前,您真的应该阅读本文。我的最后一个建议是使用有意义的别名,而不是a,b,c动态SQL is
EXECUTE(@SQL)
,它执行@SQL中的字符串。您正在执行的是变量过程执行:
EXECUTE@SQL
,它尝试执行一个名为@SQL variableoh的存储过程。。。非常感谢。。。它工作得非常好……如果使用以下参数调用它,您会有多糟糕:
@TipoBusco='PEDIDO',@chaveBusca='';吊床--?查看
sp\u executesql
。我不知道你的意思。你为什么要在这里使用动态sql?这里的内容容易受到sql注入的攻击。您应该在这里使用参数化查询,而忽略动态sql。您还拥有旧的ANSI-89样式的联接语法。你应该更新一下。在继续使用nolock提示乱丢数据库之前,您真的应该阅读本文。我的最后一个建议是使用有意义的别名,而不是a、b、c
ALTER PROCEDURE LISTA_PEDIDOS
@Sdatainicio varchar(100),
@Sdatafim varchar(100),
@chaveBusca varchar(100),
@TipoBusca varchar(100) 

AS 
DECLARE @SQL VARCHAR(8000) = ''

SET @SQL += 'SELECT a.*,b.descricao as dscstatus,c.nome as cliente '

SET @SQL += ' FROM pedidos   a with(nolock), '
SET @SQL += ' pedidos_status b with(nolock), '
SET @SQL += ' cadastro c with(nolock) '

SET @SQL += ' WHERE '
SET @SQL += ' a.status <> '''' and '
SET @SQL += ' a.status=b.status and '
SET @SQL += ' a.id_doc = c.id_doc '



IF isnull(@chaveBusca,'')<>''
 BEGIN

     IF isnull(@TipoBusca,'') = 'PEDIDO'
        SET @SQL += ' and a.numped= '''+@chaveBusca+''''

     IF isnull(@TipoBusca,'') = 'CLIENTE'
        SET @SQL += ' and c.nome like '''+@chaveBusca+'%'''
 END

IF not (isnull(@chavebusca,'')<>'' and isnull(@TipoBusca,'') = 'PEDIDO')
    SET @SQL += ' and data_inclusao BETWEEN '''+@Sdatainicio+''' AND '''+@Sdatafim+''''

EXECUTE @SQL
exec LISTA_PEDIDOS '20160101','20160202','CAR','CLIENTE'