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 isEXECUTE(@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'