PDA

View Full Version : مشکل در syntax



ma.andishe
دوشنبه 04 فروردین 1393, 14:15 عصر
با سلام لطفا راهنمایی بفرمایید




من میخواهم به جای radifnemone یک متغییر بزارم که به ازای اون متغییر بره و فانکشم مورد نظر رو بخونه
SELECT

CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation

WHEN 1 THEN 'Delete'

WHEN 2 THEN 'Insert'

WHEN 3 THEN 'Update - Pre'

WHEN 4 THEN 'Update - Post'

END AS Operation,

CT.*,

LSN.tran_begin_time,

LSN.tran_end_time,

LSN.tran_id

FROM
cdc.fn_cdc_get_net_changes_dbo_radifNemone (@from_lsn, @to_lsn, N'all update old') AS CT

INNER JOIN

cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn





END

حمیدرضاصادقیان
سه شنبه 05 فروردین 1393, 09:44 صبح
سلام.
شما باید از dynamic Query استفاده کنید و اونجا رو با اسم یک متغیر پر کنید و اونو Exec کنید.
اگر در سایت هم جستجو کنید موارد متعددی رو میتونید پیدا کنید.

ma.andishe
چهارشنبه 06 فروردین 1393, 11:08 صبح
سلام ممنون از جوابتون ولی متاسفانه جواب نمیگیرم
ALTER PROCEDURE [dbo].[showchange]
@nametable nvarchar(50)

AS
declare @str nvarchar(max)


BEGIN

SET NOCOUNT ON;
DECLARE @from_lsn binary(10), @to_lsn binary(10)

SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)

SET @to_lsn = sys.fn_cdc_get_max_lsn()
set @str=N'SELECT


CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation

WHEN 1 THEN D

WHEN 2 THEN I

WHEN 3 THEN U - Pre

WHEN 4 THEN U - Post

END AS Operation,

CT.*,

LSN.tran_begin_time,

LSN.tran_end_time,

LSN.tran_id

FROM

cdc.fn_cdc_get_all_changes_dbo_@nametable (@from_lsn, @to_lsn, '') AS CT


INNER JOIN

cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn)'

Execute Sp_executeSQl @str

END

ma.andishe
چهارشنبه 06 فروردین 1393, 16:49 عصر
من این کد زو به صورتهای متفاوتی نوشتم ولی تا حالا جواب نگرفتم تمام مشکل من در خال خاضر پارامترهای اون تابع هستش که ست نمیشن و به همین دلیل جوابی رو بر نمیگردونه

declare @nametable nvarchar(50)

declare @str nvarchar(max)
DECLARE @from_lsn binary(10), @to_lsn binary(10)

BEGIN


set @nametable='radifnemone'
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
print @from_lsn
SET @to_lsn = sys.fn_cdc_get_max_lsn()
print @to_lsn


set @str=N'SELECT

CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation

WHEN 1 THEN D

WHEN 2 THEN I

WHEN 3 THEN U - Pre

WHEN 4 THEN U - Post

END AS Operation,

CT.*,

LSN.tran_begin_time,

LSN.tran_end_time,

LSN.tran_id

FROM

cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+ CONVERT(char(10),@from_lsn) +','+ CONVERT(char(10),@to_lsn) +', '') AS CT



INNER JOIN

cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'


print @str
print @from_lsn
print @to_lsn

END

حمیدرضاصادقیان
چهارشنبه 06 فروردین 1393, 19:23 عصر
اینو ببینید.
declare @nametable nvarchar(50)
declare @str nvarchar(max)
DECLARE @from_lsn binary(10), @to_lsn binary(10)

BEGIN


set @nametable='radifnemone'
SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
print @from_lsn
SET @to_lsn = sys.fn_cdc_get_max_lsn()
print @to_lsn


set @str=N'SELECT

CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation

WHEN 1 THEN D

WHEN 2 THEN I

WHEN 3 THEN U - Pre

WHEN 4 THEN U - Post

END AS Operation,

CT.*,

LSN.tran_begin_time,

LSN.tran_end_time,

LSN.tran_id

FROM

cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+ CONVERT(char(10),@from_lsn) +','+ CONVERT(char(10),@to_lsn) +', QUOTENAME('')) AS CT



INNER JOIN

cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'

print @str
print @from_lsn
print @to_lsn

END

البته باید مشخص کنید پارامترهای ورودی تابع رو مشخص کنید نوعشون چی هست؟؟

ma.andishe
چهارشنبه 06 فروردین 1393, 19:49 عصر
تشکر از اینکه جواب دادین
متاسفانه جواب نداد
ببینید پارامتر وروددیsp نام جدول هستش که@nametabel
پرامتر های تابع هم که از نوع باینری هستن
ممنون از اینکه وقت میزارید

ma.andishe
شنبه 09 فروردین 1393, 11:21 صبح
دوستان اگه کسی بلده خواهشا زاهنمایی کنه
من به اینصوزت هم نوشتم ولی بازم ارور سینتکس رو میده
declare @nametable nvarchar(50)='radifnemone'




declare @str nvarchar(max)
--DECLARE @from_lsn char(10), @to_lsn char(10)

BEGIN


--SET @from_lsn = CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_min_lsn(@nametable)))
----print @from_lsn
--SET @to_lsn =CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_max_lsn() ))
--print @to_lsn



set @str=N'SELECT

CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation
WHEN 1 THEN D ,
WHEN 2 THEN I,
WHEN 3 THEN U - Pre,
WHEN 4 THEN U - Post,
END AS Operation,

CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'(sys.fn_cdc_get_min_lsn('+@nametable +')' + ', sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
execute sp_executesql @str

--print @str
END

ferdin
شنبه 09 فروردین 1393, 22:03 عصر
دوستان اگه کسی بلده خواهشا زاهنمایی کنه
من به اینصوزت هم نوشتم ولی بازم ارور سینتکس رو میده
declare @nametable nvarchar(50)='radifnemone'




declare @str nvarchar(max)
--DECLARE @from_lsn char(10), @to_lsn char(10)

BEGIN


--SET @from_lsn = CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_min_lsn(@nametable)))
----print @from_lsn
--SET @to_lsn =CONVERT(char(10), CONVERT(int,sys.fn_cdc_get_max_lsn() ))
--print @to_lsn



set @str=N'SELECT

CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation
WHEN 1 THEN D ,
WHEN 2 THEN I,
WHEN 3 THEN U - Pre,
WHEN 4 THEN U - Post,
END AS Operation,

CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'(sys.fn_cdc_get_min_lsn('+@nametable +')' + ', sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
execute sp_executesql @str

--print @str
END


دستور Case رو اشتباه نوشتی ، بعد از هر when نیازی به کاما (,) نیست.



SELECT

CT.__$start_lsn,

CT.__$operation,
(
CASE CT.__$operation
WHEN 1 THEN D
WHEN 2 THEN I
WHEN 3 THEN U - Pre
WHEN 4 THEN U - Post
END) AS Operation,

CT.*,
LSN.tran_begin_time,
LSN.tran_end_time,
LSN.tran_id
FROM
cdc.fn_cdc_get_all_changes_dbo_radifnemone(sys.fn_ cdc_get_min_lsn(radifnemone), sys.fn_cdc_get_max_lsn()) AS CT
INNER JOIN
cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn

ma.andishe
یک شنبه 10 فروردین 1393, 11:42 صبح
من به اون شکل هم نوشتم اگه بالا رو ببینی مشکل در کانورت کردن دیتا تایپ داخل تابع هستش که گیر میده و ارور incompatible رو میده

ferdin
یک شنبه 10 فروردین 1393, 13:24 عصر
من به اون شکل هم نوشتم اگه بالا رو ببینی مشکل در کانورت کردن دیتا تایپ داخل تابع هستش که گیر میده و ارور incompatible رو میده

دوست عزیز ، میشه دقیقا error رو اینجا بزاری ، چون شما گفتی syntax error داری نه مشکل تو کانورت کردن.

ma.andishe
یک شنبه 10 فروردین 1393, 15:32 عصر
سلام ممنون که زمان میزاری
ببینید الان در حال حاضر ظاهرا ارور سینتکسش برطرف شده ولی دیتایی رو بر نمیگردونه



من ازپرنت رشته ای که درست میکنه کپی میگرم و اونو اجرا میکنم این ارور رو میده
Msg 102, Level 15, State 1, Line 30
Incorrect syntax near 'A6800'.
ضمنا خواستی تست کنی همین اسکریپت که پاین رو تست کن
declare
@nametable nvarchar(30)='radifnemone'
declare
@str nvarchar(max)
DECLARE @from_lsn varbinary(10), @to_lsn varbinary(10),@row_filter_option nvarchar(30) = N'all'

BEGIN


SET @from_lsn = sys.fn_cdc_get_min_lsn(@nametable)
--print @from_lsn
SET @to_lsn =sys.fn_cdc_get_max_lsn()
--print @to_lsn



set @str=N'SELECT

CT.__$start_lsn,

CT.__$operation,

CASE CT.__$operation

WHEN 1 THEN D

WHEN 2 THEN I

WHEN 3 THEN U - Pre

WHEN 4 THEN U - Post

END AS Operation,

CT.*,

LSN.tran_begin_time,

LSN.tran_end_time,

LSN.tran_id

FROM


cdc.fn_cdc_get_all_changes_dbo_'+ @nametable +'('+CONVERT(VARCHAR(10), @from_lsn,2)+','+CONVERT(VARCHAR(10), @to_lsn,2)+','+@row_filter_option+') AS CT

INNER JOIN

cdc.lsn_time_mapping AS LSN ON CT.__$start_lsn = LSN.start_lsn'
exec sp_executesql @str
print @str
END

ma.andishe
دوشنبه 11 فروردین 1393, 19:36 عصر
دوستان کسی نیست کمک کنه؟
ببینیید من مساله جور دیگه میگم
توی یک کوئری که به صورت داینامیک نوشته شده چطور میشه متغیرهایی رو در اون جا داد یعنی کانورت کرد که شکل ظاهری اون متغییر عوض نشه چون برای سنجیدن استفاده میشه
این متغیره در اصل باینری هستند و باید به صورت استرینگ در داخل کوئری داینامیک استفاده شود

ma.andishe
سه شنبه 12 فروردین 1393, 12:01 عصر
دوستان به این شکل نوشتم جواب داد
USE [kaavianmfs]
GO
/****** Object: StoredProcedure [dbo].[showchange] Script Date: 04/01/2014 10:25:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[showchange]
@nametable nvarchar(15)
AS
declare @str nvarchar(max),@row_filter_option nvarchar(30) = '''all'''
declare @from_lsn varbinary(30)=null, @to_lsn varbinary(30)=null
declare @begin_time datetime, @end_time datetime
declare @DELETE CHAR(10)='''DEL''',@INSERT CHAR(10)='''INS''',@UPDATE_PRE CHAR(10)='''U-PRE''',@UPDATE_POS CHAR(10)='''U-POS'''

SET @begin_time = GETDATE()-7;
--print @begin_time
SET @end_time = GETDATE();
--print @end_time

BEGIN

SET NOCOUNT ON;

SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
--print @from_lsn
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than', @end_time);
--print @to_lsn

set @str =N'select sys.fn_cdc_map_lsn_to_time(__$start_lsn) AS ChangeDTS
,
CASE __$operation

WHEN 1 THEN '+ @DELETE +'
WHEN 2 THEN '+ @INSERT +'
WHEN 3 THEN '+ @UPDATE_PRE +'
WHEN 4 THEN '+ @UPDATE_POS +'

END AS Operation,*

from
cdc.fn_cdc_get_all_changes_dbo_'+ LTRIM(rtrim(@nametable))+'('+CONVERT(varchar(max), @from_lsn,1)+','+CONVERT(varchar(max), @to_lsn,1)+','+ @row_filter_option +')'
exec sp_executesql @str
--print @str
end